接口幂等性

1. 概念

接口幂等性

一次和多次请求某一个资源,对资源本身所产生的的影响均与一次执行的影响相同

幂等性是系统服务对外的一种承诺,承诺只要调用接口成功了,多次调用对系统的影响是一致的。

2. 幂等性与重复提交比较

幂等性 更多使用的情况是第一次请求知道结果,但是由于网络抖动或连接超时等情况未进行正常返回,在这种情况下系统自动再次发起请求,其目的是确认第一次是否请求完成。

重复提交 更多使用的情况是第一次请求成功或请求结果暂未返回的情况下,人为的进行多次操作。

实际上二者表现的情况是一样的,都会多次的调用一个接口,并且传参相同。

3. SQL语句的幂等性

3.1 SELECT

1
SELECT * FROM `table_name` WHERE id = 1024;

select语句具有天然的幂等性,因为select语句只是进行查询,并不会修改数据。

3.2 UPDATE

1
UPDATE table_name SET column_xx = 'xxx' WHERE id = 1024;

像上面这个update语句,执行多次和执行一次是一样的效果,这样的是幂等的。

下面这个update语句就不是幂等的。

1
UPDATE table_name SET column_xx = column_xx + 1 WHERE id = 1024;

3.3 DELETE

1
DELETE FROM table_name WHERE id = 1024;

这样的删除语句也是幂等的。

3.4 INSERT

1
INSERT INTO table_name (xxx, xxx, xxx) VALUES (aa, bb, cc);

插入语句不是幂等的。除非插入的数据项中有一个唯一索引,并且语句如下所示:

1
INSERT INTO table_name (xxx, xxx, xxx) VALUES (aa, bb, cc) ON DUPLICATE KEY UPDATE ...

4. 实现方案

4.1 方案一

下游系统提供相应查询接口。

上游系统在 timeout 后,首先去查询一下,如果查到了,就表明已经做了,成功了就不用做了,失败了就走失败流程。

4.2 方案二

将这个查询操作交给下游系统,上游系统只管重试,下游系统保证一次和多次的请求产生的影响是一样的。这时我们就说下游系统提供的接口支持幂等性。

5. 下游系统实现接口幂等性

5.1 通过代码逻辑判断实现

https://www.cnblogs.com/huaixiaonian/p/9577567.html

5.2 通过token机制实现

使用token机制实现接口幂等性,通用性强的实现方法

token机制实现步骤:

  1. 生成全局唯一的token,token放到redis或jvm内存,token会在页面跳转时获取.存放到pageScope中,支付请求提交先获取token

  2. 提交后后台校验token,执行提交逻辑,提交成功同时删除token,生成新的token更新redis ,这样当第一次提交后token更新了,页面再次提交携带的token是已删除的token后台验证会失败不让提交

token特点: 要申请,一次有效性,可以限流

注意: redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用