北京网站建设华大,aso优化是什么,流感最新消息:近期流感爆发,正规免费发布信息平台分布式幂等性如何设计#xff1a;
在高并发场景的架构里#xff0c;幂等性是必须得保证的。比如说支付功能#xff0c;用户发起支付#xff0c;如果后台没有做幂等校验#xff0c;刚好用户手抖多点了几下#xff0c;于是后台就可能多次受到同一个订单请求#xff0c;不…分布式幂等性如何设计
在高并发场景的架构里幂等性是必须得保证的。比如说支付功能用户发起支付如果后台没有做幂等校验刚好用户手抖多点了几下于是后台就可能多次受到同一个订单请求不做幂等很容易就让用户重复支付了这样用户是肯定不能忍的。
解决方案
1 查询和删除不在幂等讨论范围查询肯定没有幂等的说删除第一次删除成功后后面来删除直接返回0也是返回成功。
2建唯一索引 唯一索引或唯一组合索引来防止新增数据存在脏数据 当表存在唯一索引并发时新增异常时再查询一次就可以了数据应该已经存在了返回结果即可。
3token机制 由于重复点击或者网络重发或者nginx重发等情况会导致数据被重复提交。前端在数据提交前要向后端服务的申请tokentoken放到 Redis 或 JVM 内存token有效时间。提交后后台校验token同时删除token生成新的token返回。redis要用删除操作来判断token删除成功代表token校验通过如果用selectdelete来校验token存在并发问题不建议使用。
4悲观锁
select id ,name from table_# where id## for update;悲观锁使用时一般伴随事务一起使用数据锁定时间可能会很长根据实际情况选用另外还要考虑id是否为主键如果id不是主键或者不是 InnoDB 存储引擎那么就会出现锁全表。
5乐观锁 给数据库表增加一个version字段可以通过这个字段来判断是否已经被修改了
update table_xxx set name#name#,versionversion1 where version#version#6分布式锁 比如 Redis 、 Zookeeper 的分布式锁。单号为key然后给Key设置有效期防止支付失败后锁一直不释放来一个请求使用订单号生成一把锁业务代码执行完成后再释放锁。
7保底方案 先查询是否存在此单不存在进行支付存在就直接返回支付结果。