幂等性就是一个请求和多个请求产生相同的副作用。
在系统高并发的环境下,很可能由于网络阻塞的原因,导致客户端或者调用方并不能及时的收到服务端的处理结果,甚至是调用超时的问题。
总之,是客户端调用了你的服务,但是没有收到任何响应。在客户端会重试请求会造成什么问题呢?
-
创建订单,第一次调用服务超时,再次调用是否会创建两个订单
-
订单创建成功去删减库存的时候,第一次剪库存失败,再次请求,库存会剪2次吗?
按照幂等性的要求,上面的两种情况都不能发生。
可能会发生重试和消费的场景都需要考虑幂等性。在分布式,微服务的架构中,幂等处理随处可见。
-
网络波动,因为网络波动,可能会引起重复请求
-
分布式消息消费,任务发布后,使用分布式消息服务进行消费
-
用户重复操作,用户在使用产品时,可能无意的触发多笔交易,甚至,没有响应,有意的触发多次操作
-
未关闭重试机制,Nginx重试或者其他RPC框架的重试机制
-
注册用户礼包领取
-
抢红包
-
账单付款
增删改查操作的幂等性分析
-
创建: 不具备幂等性
-
删除:一般请款下,无论是物理删除还是逻辑删除,都具备幂等性
-
修改:不一定具备幂等性,看情况
-
查询: 天然幂等
如果一个微服务不具备幂等性,可能会出现很严重的问题:
-
电商行业的产品超卖问题
-
多次扣款
-
优惠券多次叠加
-
幂等机制
- 保证资源唯一性
- 防止重复消费
-
确保方案
- 全局唯一ID
- 数据库层:唯一索引
- 服务层: 分布式锁
- 状态机
- 先查询在创建 , 先插入在更新
- 其他