该方案就是操作之前先查询一下,符合要求再插入,该方案在没有并发的系统中可以解决幂等问题,在单JVM有并发的时候可以用JVM加锁来保证幂等性,在分布式环境它是无法保证幂等性,可以使用分布式来保证 。
- 分布式锁
如果是分布是系统,构建全局唯一索引比较困难,例如唯一性的字段没法确定,这时候可以引入分布式锁,通过第三方的系统(redis或zookeeper),在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路 。要点:某个长流程处理过程要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成后,释放分布式锁(分布式锁要第三方系统提供) 。
- 状态机幂等
在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机(状态变更图),就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等 。注意:订单等单据类业务,存在很长的状态流转,一定要深刻理解状态机,对业务系统设计能力提高有很大帮助。
- 防重表
以支付为例: 使用唯一主键去做防重表的唯一索引,比如使用订单号作为防重表的唯一索引,每一次请求都根据订单号向防重表中插入一条数据,插入成功说明可以处理后面的业务,当处理完业务逻辑之后删除防重表中的订单号数据,后续如果有重复请求,则会因为防重表唯一索引原因导致插入失败,直接返回操作失败,直到第一次请求返回结果,可以看出防重表作用就是加锁的功能 。
注: 最好结合状态机幂等先判断一下
- 缓冲队列
将请求都快速地接收下来后放入缓冲队列中,后续使用异步任务处理队列中的数据,过滤掉重复的请求,该解决方案优点是同步处理改成异步处理、高吞吐量,缺点则是不能及时地返回请求结果,需要后续轮询得处理结果 。
- 全局唯一号
比如通过source来源 + 唯一序列号传入给后端,后端来判断请求是否重复,在并发时只能处理一个请求,其他相同并发请求要么返回请求重复,要么等待 前面请求执行完成后再执行 。
作者:三分恶
原文链接:https://www.cnblogs.com/three-fighter/p/14054749.html
推荐阅读
-
-
贝贝豆育儿课堂|又贵又没营养,你还在给孩子喝吗,这种“假酸奶”毁了很多孩子
-
|40岁董璇身材超棒,炫腹上衣搭配花蝴蝶外套,看着就像20岁!
-
传染病■全球病例持续飙升,带你了解海外疫情发展大事件
-
琳视角▲韦德向两人致歉,詹皇宣布参加慈善节目,库里夫妇曾遭遇感情危机
-
-
柏寒|逝世10年后,才明白柏寒为何弥留之际,要将儿子托付给海清
-
古人|龙生九子各有不同,为何没有一个长得像龙,看龙夫人你就知道了
-
[奔驰C级]先花33万开奔驰C级,26万再开沃尔沃S60,车主:实力相当
-
幼儿园中班学期末班主任工作总结?幼儿园中班班主任期末总结报告_2
-
-
不考虑法律,仅从技术层面讲,牵张成骨/肢体延长是不是可用于重塑骨骼形状,如盆骨增宽、重塑面型等
-
ETtoday生活方式▲认错才是深爱!吵架最先低头的3大星座 巨蟹拼命为对方找台阶
-
「健身」男人从麻杆到肌肉型男,女人从骨感到微胖多肉,看完快去健身
-
-
#国际能源网#802.5MW,77.9亿元!四川省2020年风电重点项目出炉!,5个项目
-
「杨力伟音乐排行榜」纳什让人恶心,而他被球迷调侃像在蹲马桶,NBA罚球前的小动作
-
-
三国大臣: 陛下, 你为何造反? 皇帝回答了一句话, 从此流传千年
-
对撞机|自称是穿越者的“未来人”,现状如何?还有一位被捕是怎么回事?