如何实现接口幂等性?

1. 什么是幂等?

幂等是一个数学与计算机科学概念。

计算机科学中,幂等表示一次和多次请求某一个资源应该具有同样的副作用,或者说,多次请求所产生的影响与一次请求执行的影响效果相同

2.SQL的幂等性

SELECT * FROM USER WHER ID = 1;            // 无论执行多少次重复请求,都不会改变状态,是天然的幂等。
UPDATE USER SET STATE =  1 WHERE ID = 1;   // 无论执行多少次重复请求,都不会改变状态,也是幂等操作。
UPDATE USER SET AGE = AGE + 1 WHERE ID = 1;// 每次执行的结果都会发生变化,这种就不是幂等的。

HTTP方法的幂等性是指在多次执行相同请求的情况下,服务器的状态不会改变。以下是以表格形式展7GET、POST、PUT、DELETE方法是否满足幂等性:

3.什么是接口幂等性?

接口幂等性简单来说,就是需要确保一个操作无论执行多少次,其结果和对系统状态的影响都与执行一次相同。换个维度,也可以理解为对于相同的请求,无论请求多少次,都应该返回相同的结果。(即重复请求获得相同的响应,而不应该产生额外的副作用)。

注:幂等性的概念并不局限于分布式系统,它同样适用于单机架构。幂等性是一种设计原则,确保了操作的一致性和可预测性。

4.什么场景需要幂等设计?

一般对数据要求比较高的场景,如:金钱交易、数据一致性至关重要的业务场景:

在线支付:当用户发起支付请求时,避免重复扣款。

银行交易:确保同一笔交易不会因网络重试等原因被执行多次。

票务系统:在线购票平台在用户购票时,检查所选座位是否已被重复预订。

通信服务:如短信或通话服务,系统会检查是否已为相同内容的请求计费。

用户注册:防止因重复提交表单而导致用户信息被创建多次。

4.如何产生幂等问题?

产生幂等性问题的原因主要有:

网络请求重试:网络波动或超时,客户端可能会重复发送相同的请求。

用户界面重复提交:用户在用户界面上可能会不小心重复点击按钮,导致相同的请求被发送多次。

消息队列重试机制:使用消息队列(如Kafka、RabbitMQ)时,消息可能会被重复消费。

数据库并发操作:数据库的插入、更新和删除操作多个事务同时修改同一条记录,而没有使用适当的锁机制或事务隔离级别。

外部系统API接口重试:对外提供的API接口可能由于调用方的重试逻辑,导致数据库操作被重复调用。

6.如何保证幂等?

7.幂等方案(防重令牌)的原理

①. 服务端提供获取TOKEN的接口;

②. 客户端向服务端发起请求前,第一步先获取TOKEN,将该TOKEN存入REDIS后并将TOKEN返回给客户端;

③. 第二步,客户端在HEADER中携带该TOKEN向服务端发起业务请求;

④. 服务端接收请求从HEADER中解析TOKEN,并在REDIS中查找该TOKEN;

⑤. 如果TOKEN存在,则删掉该TOKEN,继续执行下面的业务操作;

⑥. 如果TOKEN不存在,说明第一次请求已将TOKEN删除,当前的请求并不是第一次请求,则返回重复操作的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

这孩子叫逆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值