幂等操作如何实现
2024年9月13日大约 1 分钟
幂等操作如何实现
幂等操作大致可以分为两种,一种是客户端幂等操作,一种是服务端幂等操作
区别就在于是哪一方发起的请求
如果是客户端发起的请求,那就是客户端幂等
如果是服务器间发起的请求,就是服务器端幂等(例如服务 A 调用服务 B,B 是否需要支持幂等呢?)
客户端幂等操作
重复提交表单,比如
- 重复下订单
- 消耗金币、钻石、抽奖券进行抽奖时,连续点击导致的并发,这个是否需要进行幂等
解决方案:
- 增加一步向后台申请 token 的操作
- 客户端在提交表单时需要携带这个 token
- 服务器根据这个 token 做如下判断(token 在使用后存在 Redis 中)
- token 存在:已经使用过,拒绝请求直接返回
- token 不存在:请求第一次进来,进行后续业务操作
(或者说根据表单里面的一些数据,组合成唯一的键,来确定是否已入库进而实现幂等)
服务器端幂等操作
- 消息重复消费
- 扣减库存
- 短信通知
以扣减库存为例
扣减库存时,需要几个重要参数,订单 ID、SKU、扣减数量
一个订单只能进行一次库存扣减,如果在库存扣减记录表中已经存在了相关的扣减记录,那就拒绝请求,直接返回,若没有才进行后续的业务操作
幂等的类型
- 弱幂等
cache 内判断
如短信发送 - 强幂等
数据库内判断
像金额扣减、库存扣减