业务幂等性方案设计

版权声明:转载请注明来源! https://blog.csdn.net/lstcui/article/details/83893931

幂等概念:
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

例如,setTrue()函数就是一个幂等函数,无论多次执行,其结果都是一样的.
      更复杂的操作幂等保证是利用唯一交易号(流水号)实现.

现实场景:
1、前端重复提交选中的数据给后台服务器,则后台只产生唯一的结果;
2、我们发起一笔付款请求,服务器只能扣用户账户一次钱,即使遇到网络断开后重发或系统其他的原因重发,也必须只能扣一次钱;
3、我们支付一次款项只能产生一条流水数据,如果产生多条流水则会出现问题;
等等以上场景的逻辑都需要幂等的特性来支持

实际上,我们常用的HTTP协议的方法是具有幂等性语义要求的,
比如:GET方法用于获取资源,不应有副作用,因此是幂等的;
           POST方法用于创建资源,每次请求都会产生新的资源,因此不具备幂等性;
           PUT方法用于更新资源,是幂等的;
           DELETE方法用于删除资源,也是幂等的。


常见用来保证幂等的技术方案:

  • 乐观锁机制

合理的使用乐观锁,通过version或者updateTime(timestamp)等其他条件,来做乐观锁的判断条件。
例如
select * from tablename where condition=#condition# //取出要跟新的对象,带有版本versoin
update tableName set name=#name#,version=version+1 where version=#version#

  • 悲观锁机制

每次操作数据时都会被加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起;现实中考虑的并发的要求,可能很少使用该方案;

  • 唯一索引机制

  在核心的流水表中,使用流水号作为唯一索引,在前端支付或其他POST请求时,利用该唯一索引来防止产生重复数据;

  • SELECT + INSERT 机制

  也就是在插入前先查询下是否已经存在,判断是否已经执行过;这种机制适用于并发不高的后台管理系统;

  • token机制 防止页面重复提交

   实际需求:前端页面维护数据只能被提交一次,但往往会由于卡顿导致重复点击或者网络重发或者NGINX重发等情况会导致重复请求
   解决办法:
   如果是单个服务器可以采用TOKEN加REDIS或TOKEN加其它框架来利用JVM内存,如果是集群环境可以采用TOKEN加REDIS机制;
 

猜你喜欢

转载自blog.csdn.net/lstcui/article/details/83893931
今日推荐