幂等性的定义
任意多次执行所产生的影响均与一次执行的影响相同。
需要幂等的场景
对于客户端发起的一次请求,在请求处理链调用和处理的每一个环节,都有可能会发生网络错误,丢包和超时的问题,面对这些情况,一般采取的策略就是请求重试,我们如何识别这一次的请求究竟是新的请求还是旧请求的充实操作,如何对已经完成的请求去重,就是我们需要考虑的幂等策略。
如何实现幂等:
- 唯一标识(令牌):对每个请求生成唯一的幂等令牌作为标识
- 唯一操作:要能保证服务端对指定请求唯一执行消费
多数幂等操作需要依赖数据库的唯一索引完成,或者通过数据库的状态机乐观锁来记录请求执行的过程和目前情况,方案说着很简单,但是我们还是需要考虑一下下面的问题:
- 对于多层级的系统,如果存在 A–B,B–C,C–D,… 的调用链,如何保证每个环节都是幂等的,防止出现幂等陷阱,一个环节的不幂等,就会破坏整个系统的幂等性。
- 如何生成唯一标识令牌,保证其唯一性,如果第一个环节就出错了。后面再怎么努力都没办法保证幂等。
- 唯一标识令牌会不会被回滚丢失了,丢失回滚了怎么办?目前能想到的就是多副本,只要保证数据还有一个备份,问题最大也就只是一致性问题。、
- 因为幂等本质要求是去重,去重就有互斥,互斥就会竞争,系统层级越深,互斥竞争越严重,效率降低和死锁的风险越大。
一些具体经验:
暂时没有,作者还在实习呢,啥都不会,就一傻子