什么是幂等性解决方案

今天看到一篇讲幂等的文章,想起来上次面试的时候有问过,记录一下,加深印象。

一、什么是幂等

首先说一下幂等的概念,官方一点的说法是:在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。其实可以简单理解为多次操作和一次操作的结果是一样的。

二、为什么要幂等

一般情况下接口正常调用的时候返回信息不会重复提交,但某些情况可能会导致重复提交。比如:
1:前端重复提交表单:在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。
2、用户恶意进行刷单:例如在实现用户投票这种功能时,如果用户针对一个用户进行重复提交投票,这样会导致接口接收到用户重复提交的投票信息,这样会使投票结果与事实严重不符。3、接口超时重复提交:很多时候 HTTP 客户端工具都默认开启超时重试的机制,尤其是第三方调用接口时候,为了防止网络波动超时等造成的请求失败,都会添加重试机制,导致一个请求提交多次。
4、消息进行重复消费:当使用 MQ 消息中间件时候,如果发生消息中间件出现错误未及时提交消费信息,导致发生重复消费。

三、幂等对系统的影响

引入幂等也是会对系统有影响的,比如:1、把并行执行的功能改为串行执行,降低了执行效率。2、增加了额外控制幂等的业务逻辑,复杂化了业务功能;所以在引入幂等性之前,我们要考虑清楚看是否有必要引入。

四、实现幂等的几种方案

那么下面就介绍一些实现幂等的几种方案:
1、查询操作:查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select是天然的幂等操作;同理删除操作也是幂等的
2、唯一索引:比如说账户,怎么能保证每个人只能有一个账户,给资金账户表里的用户id添加唯一索引就ok。
3、token:防止页面重复提交。通过session token实现,客户端请求页面时,服务器会生成一个随机数Token,将Token放置到session中,然后将Token发给客户端。下次客户端提交请求时,Token会随着表单一起提交到服务器端。服务器端第一次验证相同过后,会将session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端session中Token已经改变了。
4、悲观锁:获取数据的时候加锁获取,悲观锁使用时一般伴随事务一起使用。
5、乐观锁:乐观锁只是在更新数据那一刻锁表,其他时间不锁表。相对于悲观锁效率更高。乐观锁的实现方式很多,比如通过version或其他状态条件。
6、分布式锁:分布式系统的话可以选择引入第三方来实现,比如redis,zk等。这部分是内容比较多,简单来说就是在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁。
7、状态机:状态机的应用是比较多的,其实有表单就可以考虑做状态机,根据状态去流转。

五、总结

幂等是比较常用的一个操作,尤其是跟资金相关的业务上非常常见,也是比较重要的一个问题,幂等做不好会出现很多问题,比如重复支付等,会很麻烦用户体验也不好,所以学习一下蛮重要的。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值