前言
在系统开发过程中,经常遇到数据重复插入,重复更新,消息重发发送等等问题,因为应用系统的复杂逻辑以及网络交互存在的不确定性,会导致这一重复现象,但是有些逻辑是需要有幂等特性的,否则造成的后果会比较严重,例如订单重复创建,这时候带来的问题可是非同一般啊
什么是系统的幂等性
幂等是数据中得一个概念,表示N次变换和1次变换的结果相同
高并发的系统如何保证幂等性?
1.查询
查询的API,可以说是天然的幂等性,因为你查询一次和查询两次,对于系统来讲,没有任何数据的变更,所以,查询一次和查询多次一样的
2.MVCC方案
多版本并发控制,updatewithcondition,更新带条件,这也是在系统设计的时候,合理的选择乐观锁,通过version或者其他条件,来做乐观锁,这样保证更新及时在并发的情况下,也不会有太大的问题
例如:updatetable_xxxsetname#name#,versionversion+1whereversion#version#,或者是updatetable_xxxsetqualityquality-#subQuality#wherequality-#subQuality#gt;0
3.单独的去重表
如果涉及到的去重的地方特别多,例如ERP系统中有各种各样的业务单据,每一种业务单据都需要去重,这时候,可以单独搞一张去重表,在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑
4.分布式锁
还是拿插入数据的例子,如果是分布是系统,构建唯一索引比较困难,例如唯一性的字段没法确定,这时候可以引入分布式锁,通过第三方的系统,在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路
5.删除数据
删除数据,仅仅第一次删除是真正的操作数据,第二次甚至第三次删除,直接返回成功,这样保证了幂等
6.插入数据的唯一索引
插入数据的唯一性,可以通过业务主键来进行约束,例如一个特定的业务场景,三个字段肯定确定唯一性,那么,可以在数据库表添加唯一索引来进行标示
这里有一个场景,API层面的幂等,例如提交数据,如何控制重复提交,这里可以在提交数据的form表单或者客户端软件,增加一个唯一标示,然后服务端,根据这个UUID来进行去重,这样就能比较好的做到API层面的唯一标识
7.状态机幂等
在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机,就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等
以上就是高并发系统数据幂等的解决方案的资料整理,后续继续补充相关知识,谢谢大家对本站的支持!
首先,产品解决方案我们就不予讨论了我们只讨论技术解决方案
面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】
A:扩容
加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值
B:静态化
将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素通过CDN来抗峰值
C:限流
一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量
或者活动入口的时候增加游戏或者问题环节进行消峰操作
D:有损服务
最后一招,在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性
这种时候可以通过队列,比如每次有人下单,就丢到队列里面,然后队列里面校验库存,这样有并发的时候也只是多插入了队列,但是队列里面是依次执行的队列的话可以参考下redis如何做队列处理有php相关扩展的,java的话我就不清楚了
你好!
楼上的是正经,用redis或者其他的非关系型数据库,放到队列里面
希望对你有所帮助,望采纳
还没有评论,快来抢沙发吧!
最新发现
相关资讯
鸡头算法,编写一个程序,已知鸡兔总数为a,鸡兔腿总数为b,计算出鸡兔个多少...
穷举法,将所有情况算出,然后一一验证让rhead从0取到head这样就可以算出chead的值两种动物的头的数知道了就可以算出总的腿数,然后跟feet比较即可如果成功就输出鸡和兔子的数量
2024-06-16 08:01:40
藏头诗c语言改错,C语言改错!
if(i%k0)break
2024-06-16 08:01:37
坦途皮卡后驱怎么设置,后驱的两驱的坦途可以改成四驱吗都需要改什么谢谢
发动机2011款坦途4.6l手自一体一门半2011款坦途4.6l手自一体双门2011款坦途5.7l手自一体一门半2011款坦途5.7l手自一体双门2009款坦途标配2009款坦途高配燃油箱容积100l100l100l100l100l100l燃料类型汽油汽油汽油汽油汽油汽油燃油标号97#97#
2024-06-16 08:01:01
路由器芯片可以放手机里吗,手机可以添加WLAN模块么
一次性购买花费为310元,使用费用1毛1兆经常使用的那个月可以买充值套餐,16元200兆,但是这个套餐要求3个月内用完,如果是1元1元的充话费的话就是1元10兆,不限使用时间使用起来也很方便,联通卡放华为网卡里,网卡插移
2024-06-16 07:58:54
移动硬盘串口维修教程,移动硬盘上的接口坏了,怎么维修
1,移动硬盘接口坏了怎么办
2024-06-16 07:58:52
新闻热榜
热门游戏
精彩专题