接口的幂等性表现在多次重复的提交操作,返回的结果一致
比如查询,每次成功的查询都是天然的幂等性
再比如支付提交(insert操作),如果接口不具备幂等性,那么如果因为网络波动等原因造成的重复提交订单,而导致重复扣款,就导致了业务问题
解决接口幂等
- 数据库生成唯一索引 (数据库层次)
UNIQUE
- token机制
- 客户端在请求接口之前先向服务端申请token,token存放到redis中(单次有效),并设置有效时间。
- 客户端带着token去请求接口,后端对token进行校验。
- 服务端对token需要使用 delete 操作进行校验,使用 select + delete 会存在并发问题。
1 | public void testToken(String token) { |
- 对外提供接口的api如何保证幂等
如银联提供的付款接口:需要接入商户提交付款请求时附带:source来源,seq序列号
source+seq在数据库里面做唯一索引,防止多次付款,(并发时,只能处理一个请求)
这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。
注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,但实际已经处理了。