笔记--幂等性
幂等性:WEB资源或API方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。HTTP协议的方法是具有幂等性语义要求的,比如:get方法用于获取资源,不应有副作用,因此是幂等的;post方法用于创建资源,每次请求都会产生新的资源,因此不具备幂等性;put方法用于更新资源,是幂等的;delete方法用于删除资源,也是幂等的。
常用来保证幂等的手段:
1.MVCC方案:即多版本并发控制,在系统设计的过程中,合理的使用乐观锁,通过version或者updateTime(timestamp)等其他条件,来做乐观锁的判断条件。
例如:update tableName set name=#name#,version=version+1 where version=#version#
2.去重表:在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。
3.悲观锁:整个执行过程中锁定该订单对应的记录。注意:这种在DB读大于写的情况下尽量少用。
4.select + insert:并发不高的后台系统,或者一些任务JOB,为了支持幂等,支持重复执行,简单的处理方法是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理,就可以了。注意:核心高并发流程不要用这种方法。
5.状态机幂等:根据业务单据上面的状态来判断是否执行相应的操作。
6.token机制,防止页面重复提交:
业务要求:页面的数据只能被点击提交一次
发生原因:由于重复点击或者网络重发,或者nginx重发等情况会导致数据被重复提交
解决办法:
集群环境:采用token加redis(redis单线程的,处理需要排队)
单JVM环境:采用token加redis或token加jvm内存
处理流程:
数据提交前要向服务的申请token,token放到redis或jvm内存,token有效时间
提交后后台校验token,同时删除token,生成新的token返回
token特点:要申请,一次有效性,可以限流
7.对外提供借口API幂等性实现:
如银联提供的付款接口:需要接入商户提交付款请求时附带:source来源,seq序列号。source+seq在数据库里面做唯一索引,防止多次付款,(并发时,只能处理一个请求)
总结: 幂等性应该是合格程序员的一个基因,在设计系统时,是首要考虑的问题,尤其是在像支付宝,银行,互联网金融公司等涉及的都是钱的系统,既要高效,数据也要准确,所以不能出现多扣款,多打款等问题,这样会很难处理,用户体验也不好
下一篇: 【转载】ようだ、みたいだの比較