微服务 接口 高并发 幂等 防重 高并发扣减

方案选型:

1.同步锁(单线程,集群可能会失效) 2.分布式锁如redis(高并发 实现复杂) 2.业务字段加唯一约束(简单) 3.令牌表+唯一约束(简单推荐) 4.mysql的on duplicate key update(简单 联合唯一索引 防重) 5.共享锁+普通索引(简单) 6.利用MQ或者Redis扩展(排队) 7.其他方案如多版本控制MVCC 乐观锁 悲观锁(select for update) 状态机等。。。 对客户端请求排队或者单线程都可以处理幂等问题,需要根据具体业务选择合适的方案但必须前后端一起做,前端做了可以提升用户体验,后端则可以保证数据安全。

编程中常见幂等

select查询天然幂等 delete删除也是幂等,删除同一个多次效果一样 update直接更新某个值的,幂等 update更新累加操作的,非幂等 insert非幂等操作,每次新增一条

产生原因

由于重复点击或者网络重发 eg: 点击提交按钮两次; 点击刷新按钮; 使用浏览器后退按钮重复之前的操作,导致重复提交表单; 使用浏览器历史记录重复提交表单; 浏览器重复的HTTP请; nginx重发等情况; 分布式RPC的try重发等;

文档

案例

经验分享 程序员 微信小程序 职场和发展