常用幂等解决方法

本文探讨了幂等性的概念,以及在前端请求、后端接口和分布式系统中的应用。介绍了通过去重、悲观锁、状态机和token机制来确保接口幂等性的方法,以及在不同环境下的最佳实践。
摘要由CSDN通过智能技术生成

什么是幂等?

  • 对于相同的请求应该返回相同的结果,所以查询类接口是天然的幂等性接口。
  • 幂等指的是相同请求(identical request)执行一次或者多次所带来的副作用(side-effects)是一样的。

什么常见会出现幂等?

  • 前端调后端接口发起支付超时,然后再次发起重试。可能会导致多次支付。
  • Dubbo中也有重试机制。
  • 页面上多次点击。

我们想要的是: 接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的 。

解决方案

  • 在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。
  • 悲观锁,select for update,整个执行过程中锁定该订单对应的记录。注意:这种在DB读大于写的情况下尽量少用。
  • 先查询后修改数据,并发不高的后台系统,或者一些任务JOB,为了支持幂等,支持重复执行,简单的处理方法是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理,就可以了。注意:核心高并发流程不要用这种方法。
  • 状态机幂等,在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机,就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。

token机制,防止页面重复提交:

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

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

  • 数据提交前要向服务的申请token,token放到redis或jvm内存,设置token有效时间,提交后后台校验token,同时删除token,生成新的token返回。token特点:要申请,一次有效性,可以限流

  • 全局唯一ID,如果使用全局唯一ID,就是根据业务的操作和内容生成一个全局ID,在执行操作前先根据这个全局唯一ID是否存在,来判断这个操作是否已经执行。如果不存在则把全局ID,存储到存储系统中,比如数据库、redis等。如果存在则表示该方法已经执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员JavaWind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值