接口的幂等性

接口的幂等性表现在多次重复的提交操作,返回的结果一致

比如查询,每次成功的查询都是天然的幂等性

再比如支付提交(insert操作),如果接口不具备幂等性,那么如果因为网络波动等原因造成的重复提交订单,而导致重复扣款,就导致了业务问题

解决接口幂等

  • 数据库生成唯一索引 (数据库层次) UNIQUE
  • token机制
    • 客户端在请求接口之前先向服务端申请token,token存放到redis中(单次有效),并设置有效时间。
    • 客户端带着token去请求接口,后端对token进行校验。
    • 服务端对token需要使用 delete 操作进行校验,使用 select + delete 会存在并发问题。
1
2
3
4
5
6
7
8
9
10
11
12
public void testToken(String token) {
if (RedisUtil.removeBoolean(token)) {
try {
RedisUtil.set(RandomUtils.generateToken(), "1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("支付成功");
} else {
System.out.println("请勿重复提交");
}
}

高并发下接口的幂等性设计

  • 对外提供接口的api如何保证幂等

如银联提供的付款接口:需要接入商户提交付款请求时附带:source来源,seq序列号

source+seq在数据库里面做唯一索引,防止多次付款,(并发时,只能处理一个请求)

这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。

注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,但实际已经处理了。

赏个🍗吧
0%