如何保证接口的幂等性?常见的实现方案有哪些?

幂等性问题是面试中常见的面试问题,也是分布式系统最常遇到的问题之一。

假如jackray在淘宝平台进行购物,付款的时候不小心手抖了一下,连续点击了两次支付,但此时服务器没有任何验证,于是jackray的钱被扣了两次。
这显然对当事人造成一定的经济损失,并且还会让用户丧失对平台的信任,幂等性的问题说的就是如何防止借口的重复无效请求。

1、什么是幂等性?

幂等性最早是数学里面的一个概念,后来被用于计算机领域
用于表示任意多次请求均与一次请求执行结果相同
对于一个接口而言,无论调用多少次,最终得到的结果都是一样的。

在这里插入图片描述

1.1 、前端拦截,

是指通过web站点的页面进行请求拦截,比如用户点击完"提交"按钮之后,我们可以把按钮设置为不可用或者隐藏状态,避免用户重复点击。
前端拦截有一个很大的问题 ,模拟请求,就会导致问题。

1.2、数据库实现幂等性

1.2.1 、通过悲观锁来实现幂等性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.2、通过唯一性索引来实现幂等性

创建唯一性索引的表来实现幂等性,在每次执行业务之前,先执行插入操作,因为唯一字段就是物业ID,因此如果重复插入的话会触发唯一约束而导致插入失败,在这种情况下(插入失败我们就可以判断他为重复提交的请求)
在这里插入图片描述

1.2.3、通过乐观锁来实现幂等性

乐观锁是指在执行数据操作时(更改或添加)进行加锁操作,其他时间不加锁,因此相比整个执行过程都加锁的悲观锁来说,他的执行效率要高很多。

在这里插入图片描述

1.3、JVM锁实现幂等性

jvm锁实现是指通过JVM提供的内置锁,如Lock或者是synchronize来实现幂等性

使用jvm锁来实现幂等性一般流程为:
首先通过Lock堆代码段进行加锁操作,然后再判断此订单是否已经被处理过,如果未处理则开启事务执行订单处理,处理完成之后提交事务并释放锁。
在这里插入图片描述
适用于单机 并不适用与分布式系统。

1.4、分布式锁实现

分布式锁实现幂等性的逻辑是,在每次执行方法之前判断,是否可以获取到分布式锁,如果可以,则表示为第一次执行方法,否则直接舍弃请求即可。

需要注意的是分布式锁的key必须为业务的唯一标识,通常适用redis或者zookeeper来实现分布式锁

在这里插入图片描述

在这里插入图片描述

前后端幂等性 都必须校验。

参考链接

猜你喜欢

转载自blog.csdn.net/ppwwp/article/details/107735205