概念:
幂等性是系统的接口对外一种承诺(而不是实现),承诺只要调用接口成功, 外部多次调用对系统的影响是一致的。这里的多次调用强调是指接口一致,参数一致的情况。
为什么需要幂等
幂等是为了保证重试机制不会带来数据重复,数据不一致等异常情况。
不管在单机还是分布式系统中,都存在因为网络抖动无法收到成功应答;重试补偿机制;用户无意识点击发起多次请求(业务意义上其实是同一条数据记录)等情况带来的相同参数多次调用相同接口的情况。
如何做到幂等
1、有些接口本身就是幂等的,例如查询接口,当然这是在查询数据没有做变更的情况下;删除操作一般会带有待删除数据的唯一标识,最终结果都是删除,也是幂等的。
2、对于创建新数据的情况,采用唯一业务单号,业务上的唯一条件约束。
3、在执行更新操作的时候,可以先查再决定是否更新,但这因为是非原子操作,所以在分布式系统中会存在问题。
3.1多版本控制,更新时候更新版本小于更新版本的数据 update t_xxx set name=#{newName} where version<#{version}
3.2状态机控制,增加状态字段,状态可能是有先后顺序(例如订单状态总是从待付款到已付款),也可能各个状态互相可以转化(例如与第三方同步数据,同步状态可能从更新待同步直接就变成删除待同步了)
3.3 定义去重表,先在去重表中插入,成功执行后续操作
3.4 悲观锁,select for update
4、对外提供服务的接口如何做到幂等
对外提供接口为了支持幂等调用,接口有两个字段必须传,一个是来源source,一个是来源方序列号seq,这个两个字段在己方系统里面作为唯一标识符,后续在己方系统中使用以上的方法来保证幂等。
文章内容来源于多篇文章,未能一一列举