WEB资源或API方法的幂等性是指一次和屡次请求某一个资源应该具备一样的反作用。幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部屡次调用对系统的影响是一致的。幂等性是分布式系统设计中的一个重要概念,对超时处理、系统恢复等具备重要意义。声明为幂等的接口会认为外部调用失败是常态, 而且失败以后必然会有重试。例如,在因网络中断等缘由致使请求方未能收到请求返回值的状况下,若是该资源具有幂等性,请求方只须要从新请求便可,而无需担忧重复调用会产生错误。实际上,咱们经常使用的HTTP协议的方法是具备幂等性语义要求的,好比:get方法用于获取资源,不该有反作用,所以是幂等的;post方法用于建立资源,每次请求都会产生新的资源,所以不具有幂等性;put方法用于更新资源,是幂等的;delete方法用于删除资源,也是幂等的。nginx
1.MVCC方案
多版本并发控制,该策略主要使用update with condition(更新带条件来防止)来保证屡次外部请求调用对系统的影响是一致的。在系统设计的过程当中,合理的使用乐观锁,经过version或者updateTime(timestamp)等其余条件,来作乐观锁的判断条件,这样保证更新操做即便在并发的状况下,也不会有太大的问题。例如程序员
select * from tablename where condition=#condition# //取出要跟新的对象,带有版本versoin update tableName set name=#name#,version=version+1 where version=#version#
在更新的过程当中利用version来防止,其余操做对对象的并发更新,致使更新丢失。为了不失败,一般须要必定的重试机制。redis
2.去重表
在插入数据的时候,插入去重表,利用数据库的惟一索引特性,保证惟一的逻辑。数据库
3.悲观锁api
select for update,整个执行过程当中锁定该订单对应的记录。注意:这种在DB读大于写的状况下尽可能少用。网络
4. select + insert
并发不高的后台系统,或者一些任务JOB,为了支持幂等,支持重复执行,简单的处理方法是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理,就能够了。注意:核心高并发流程不要用这种方法。并发
5.状态机幂等
在设计单据相关的业务,或者是任务相关的业务,确定会涉及到状态机,就是业务单据上面有个状态,状态在不一样的状况下会发生变动,通常状况下存在有限状态机,这时候,若是状态机已经处于下一个状态,这时候来了一个上一个状态的变动,理论上是不可以变动的,这样的话,保证了有限状态机的幂等。jvm
6. token机制,防止页面重复提交分布式
业务要求:页面的数据只能被点击提交一次
发生缘由:因为重复点击或者网络重发,或者nginx重发等状况会致使数据被重复提交
解决办法:高并发
处理流程:
token特色:要申请,一次有效性,能够限流
7. 对外提供接口的api如何保证幂等
如银联提供的付款接口:须要接入商户提交付款请求时附带:source来源,seq序列号。source+seq在数据库里面作惟一索引,防止屡次付款,(并发时,只能处理一个请求)
总结: 幂等性应该是合格程序员的一个基因,在设计系统时,是首要考虑的问题,尤为是在像支付宝,银行,互联网金融公司等涉及的都是钱的系统,既要高效,数据也要准确,因此不能出现多扣款,多打款等问题,这样会很难处理,用户体验也很差 。