中国旅游地图,高并发的核心技术 - 幂等的完成计划,cpb官网

一、布景

咱们实践体系中有许多操作,是不管做多少次,都应该发作相同的作用或回来相同的成果。

例如:

1. 前端重复提交选中的数据,应该后台只发作对应这个数据的一个反响成果。

2. 咱们主张一笔付款恳求,应该只扣用户账户一次钱,当遇到网络重发或体系bug重发,也应该只扣一次钱;

3. 发送音讯,也应该中国旅游地图,高并发的核心技能 - 幂等的完结方案,cpb官网只发一次,相同的短信发给用户,用户会哭的;

4. 创立事务订单,一次事务恳求只能创立一个,创立多个就会出大问题。

等等许多重要的状况,这些逻辑都需求幂等的特性来支撑。

二、幂等性概念

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。

在编程中.一个幂等操作的特色是其恣意屡次履行所发作的影响均与一次履行的影响相同。幂等函数,或幂等办法,是指能够运用相同参数重复履行,并能取得相同成果的函数。这些函数不会影响体系状况,也不必担心重汶川大地震复履行会对体系形成改动。例如,“中国旅游地图,高并发的核心技能 - 幂等的完结方案,cpb官网getUsername()和setTrue()”函数便是一个幂等函数.

更杂乱的操作幂等确保是运用仅有买卖号(流水号)中国旅游地图,高并发的核心技能 - 幂等的完结方案,cpb官网完结.

我的了解:幂等便是一个操作,不管履行多少采薇次,发作的作用和回来的成果都是相同的

三、技能方案

1. 查询操作

查询一次和查询屡次,在数据不变的状况下,查询成果是相同的。select是天然的幂等操作

2. 删去操作

删去操作也是幂等的,删去一次和屡次删去都是把数据删去。(留意或许回来成果不相同,删去的数据不存在,回来0,删去的数据多条,回来成果多个)

3.仅有索引,避免新增脏数据

比方:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎样避免给用户创立资金账户多个,那么给资金账户表中的用户ID加仅有索引,所以一个用户新增成功一个资金账户记载

要害:

仅有索引或仅有组合索引来避免新增数据存在脏数据

(当表存在仅有索引,并发时新增报错时,再查询一次就能够了,数据应该现已存在了,回来成果即可)

4. token机制,避免页面重复提交

事务要求:

页面的数据只能被点击提交一次

发作原因:

因为重复点击或许网络重发,或许nginx重发等状况会导致数据被重复提交

处理办法:

集群环境:选用token加redis(redis单线程的,处理需求排队)

单JVM环境:选用token加redis或token加jvm内存

处理流程:

1. 数据提交前要向效劳的恳求token,token放到redis或jvm内存,token有用时刻

2. 提交后后台校验token,一同删去token,生成新的token回来

token特色:

要恳求,一次有用性,能够限流

留意:redis要用删去操作来判别toke黄连n,删去成功代表to才智城市ken校验经过,假如用select+dele欧式装修te来校验token电梯阻止打媳妇,存在并发问题,不主张运用

5. 失望锁

获取数据的时分加锁获取

select * from table_xxx where id='蚵仔煎xxx' for update;

留意:id字段一定是主键或许仅有索引,不然是锁表,会死人的

失望锁运用时一般随同事务一同中国旅游地图,高并发的核心技能 - 幂等的完结方案,cpb官网运用,数据确认时刻或许会很长,依据实践状况选用

6. 达观锁

达观锁只是在更新数据那一刻锁表,其他时刻不锁表,所以相对于失望锁,功率更高。

达观锁的完结办法多种多样能够经过version或许其他状况条中国旅游地图,高并发的核心技能 - 幂等的完结方案,cpb官网件:

1. 经过版本号完结

update table_xxx set name=#name#,version江门市=version+1 where version=#version#

如下图(来自网上):

2. 经过条件约束

update tablexxx set avaiamount=avai阑尾方位amount-#subAmount# where avaiamount-#subAmount# >= 0

要求:quality-#subQuality# >= ,这个情形合适不必版本号,只更新是做数据安全校验,合适库存模型,扣比例和回滚比例,功能更高

留意:达观锁的更新操作,最好用主键或许仅有索引来更新,这样是行锁,不然更新时会锁表,上面两个sql改成下朱龙基面的两个更好

update tablexxx set name=#name#,version=version+1 where id=#id# and version=#version# 丫蛋蛋七友

update tabl日本豆腐exx数鸭歌x s中国旅游地图,高并发的核心技能 - 幂等的完结方案,cpb官网et avaiamount=avaiamount-#subAmo怆unt# where 女白虎id=#id# and avai_amount-#subAmount# >= 0

7. 散布式锁

仍是拿刺进数据的比如,假如骉是散布是体系,构建大局仅有索引比较困难,例如仅有性的字段无法确认,这时分能够引进散布式锁,经过第三方的体系(redis或zookeeper),在事务体系刺进数据或许更新数据,获取散布式锁,然后做操作,之后开释锁,这样其实是把多线程并发的锁的思路,引进多多个体系,也便是散布式体系中得处理思路。

要害:某个长流程处理进程要求不能并发履行,能够在流程履行之前依据某个标志(用户ID+后缀等)获取散布式锁,其他流程履行时获取锁就会失利,也便是同一时刻该流程只能有一个能履行成功,履行完结中国旅游地图,高并发的核心技能 - 幂等的完结方案,cpb官网后,开释散布式锁(散布式锁要第三方体系供给)

8. select + insert

并发不高的后台体系,或许一些使命JOB,为了支撑幂等,支撑重复履行,简略的处理办法是,先查询下一些要害数据,判别是否现已履行过,在进行事务处理,就能够了

留意:核心高并发流程不要用这种办法

9. 状况机幂等

在规划单据相关的事务,或许是使命相关的事务,肯定会触及到状况机(状况改变图),便是事务单据上面有个状况,状况在不同的状况下会发作改变,一般状况下存在有限状况机,这时分,假如状况机樱木花道现已处于下一个状况,这时分来了一个上一个状况的改变,理论上是不能够改变的,这样的话,确保了有限状况机的幂等。

留意:订单等单据类事务,存在很长的状况流通,一定要深刻了解状况机,对事务体系规划能力进步有很大协助

10. 对外供给接口的apjourneyi怎么确保幂等

如银联供给的付款接口:需求接入商户提交付款恳求时顺便:source来历,seq序列号

source+seq在数据库里边做仅有索引,避免屡次付款,(并发时,只能处理一个恳求)

要点对外供给接口为了支撑幂等调用,接口有两个字段有必要传,一个是来历source,一个是来历方序列号seq,这个两个字段在供给方体系里边做联合仅有索引,这样当第三方调用时,先在本方体系里边查询一下,是否现已处理过,回来相应处理成果;没有处理过,进行相应处理,回来成果。留意,为了幂等友爱,一定要先查询一下,是否处理过该笔事务,不查询直接刺进事务体系,会报错,但实践现已处理了。

总结

幂等性应该是合格程序员的一个基因,在规划体系时,是首要考虑的问题,尤其是在像支付宝,银行,互联网金融公司等触及的都是钱的体系,既要高效,数据也要精确,所以不能呈现多扣款,多打款等问题,这薛梦佳样会很难处理,用户体会也欠好