一、什么是幂等?
幂等指一个方法被多次重复执行的时候产生的影响和第一次执行的影响相同
二、哪些行为会导致幂等性问题?
- 用户行为:用户的重复提交或用户的恶意攻击,导致这个请求被多次重复进行
- 网络异常:在分布式架构中,为了避免网络通信导致的数据丢失,在服务之间进行通信(如http、rpc等)的时候都会设计超时重试的机制,而这种机制有可能会导致服务端接口被重复调用
三、解决方案
核心思想:保证接口的执行结果只影响一次(即后续再次调用,也不能对数据产生影响)
解决方案:
- redis实现:用setNx指令把每次执行的唯一标识存起来,判断是否执行过
- mysql实现:用唯一索引,判断是否存在(或插入时会主键冲突),比如创建订单的时候订单号是唯一的,可以用来做唯一索引,从而避免一个请求创建多个订单的问题
- 状态机:状态机指一条数据的完整运行状态的转换流程,比如订单状态,只会向前变更(如已锁定、待支付、已支付等),所以多次修改同一条数据时,对这条数据影响只会发生一次
总结:
- 要么是接口只允许调用一次,如唯一约束、redis锁
- 要么是对数据影响只会触发一次,如幂等性、乐观锁