接口幂等性
接口幂等性
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 通过代码逻辑判断实现
5.2 通过token机制实现
使用token机制实现接口幂等性,通用性强的实现方法
token机制实现步骤:
生成全局唯一的token,token放到redis或jvm内存,token会在页面跳转时获取.存放到pageScope中,支付请求提交先获取token
提交后后台校验token,执行提交逻辑,提交成功同时删除token,生成新的token更新redis ,这样当第一次提交后token更新了,页面再次提交携带的token是已删除的token后台验证会失败不让提交
token特点: 要申请,一次有效性,可以限流
注意: redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用