如何确保分布式场景下的并发幂等性?

Java技术栈

共 1171字,需浏览 3分钟

 ·

2020-10-08 07:49

Java技术栈

www.javastack.cn

关注阅读更多优质文章



本文作者:_BKing

博客地址:https://www.cnblogs.com/xiaowei123

幂等是什么 ?

幂等是数学中的一个概念,它表示如果一个东西进行1次变换或进行N次变换之后,所产生的效果如果相同的话,就称为幂等

在程序上,如果我们使用相同的请求调用这个接口一次和调用这个接口多次,对系统所产生的影响是相同的。如果一个接口满足这个特性,那么我们就说这个接口是幂等的。

这里我用些例子来说说:

1. 用户礼包领取

我们都知道一个用户新注册的时候,系统都会送该用户一份新用户大礼包,当我们点击领取这个礼包之后,我们就相当于收下了这份礼包,以后无论你怎么点击领取,结果还是一样,系统只会提示你已经领取过该礼包了,不会再让你重复领取一次。

2. 抢红包

当我们在抢一份红包的时候,我们点击了抢,抢到就有,没抢到就没有,之后,无论我们重复点击多少次,红包都会提示你已经抢过该红包了。

3. 账单付款

当我们要结账的时候,支付平台会生成唯一的支付连接,不会再次生成另外的支付连接。(不能因为这个支付接口被调了两次就创建两个一样的订单。)

N. ......

幂等机制的核心是保证资源唯一性,例如:客户端重复提交或服务端的多次重试只会产生一份结果。

如:支付场景、退款场景,涉及金钱的交易不能出现多次扣款等问题。

什么情况下需要幂等 ?

对于查询这样的接口,我们都知道,我们无论如何查询数据,都不会对原有的数据造成影响。因此不管调用多少次查询接口,资源都不会改变,所以是它是幂等的。(我们不用考虑类似这样的接口)

对于以相同的请求调用这个接口一次或多次,需要给调用方返回一致的结果时,就要考虑将这个接口设计成幂等接口。

如何保证幂等呢 ?

对于需要保证幂等的前提,我们都知道是由于多次重复提交了相同的请求。要保证幂等的条件更多是在重复请求已经发生了,这时我们要采取相应措施来保证系统的正常。

这时我们要考虑一些条件和范围,如:数据的对象和范围

  • 你要考虑你的幂等的全局性:空间全局性和时间全局性。

  • 空间全局性:比如是交易流水幂等还是用户ID幂等。

  • 时间全局性:是幂等几秒,还是几分钟,还是永远。

  • 等等……

这里推荐保证幂等机制的方法有:

1. 分布式锁

2. 创建数据库的唯一索引

3. 状态机 (通过状态机来进行状态约束和状态流转)

4. 先执行 select,后执行 insert 操作

了解更多的细节点击这里一次搞定幂等机制





关注Java技术栈看更多干货



戳原文,获取精选面试题!
浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报