接口幂等性

什么是幂等性

接口幂等性是指无论调用多少次接口,都只会产生一次结果的特性。在实际开发中,由于网络超时、服务器宕机等原因,会导致客户端重新发送请求,如果接口不具有幂等性,就可能会产生副作用,例如重复插入数据等。


预防重复提交与幂等性的区别

防止重提交接口的表现

  1. 第一次提交张三工资涨500,数据库update操作,接口返回“操作成功”
  2. 后续相同请求:拒收请求:张三工资涨500,接口直接返回“请勿重复提交”

幂等性接口的表现

  1. 第一次提交张三工资涨500,数据库update操作,接口返回“操作成功”
  2. 后续相同请求:接收请求:张三工资涨500,数据库不做任何写操作,接口返回“操作成功”

幂等问题产生场景

企业微信业务回调-因为网络波动没及时响应-重推机制

image

618的时候RibbitMQ堆积严重,导致内存爆了,响应不及时,触发了RibbitMQ重试机制,消费了很多重复消息

image

重复提交

重复提交是指在进行网络请求时,由于网络延迟、用户误操作或其他原因,导致同一个请求被发送多次的情况。这可能会带来一些问题,比如重复插入数据、重复购买等。

幂等性接口设计方案


通过业务数据过滤重复数据

企业微信产生重复回调的场景

企业微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如果企业在调试中,发现成员无法收到被动回复的消息,可以检查是否消息处理超时。
当接收成功后,http头部返回200表示接收ok,其他错误码企业微信后台会一律当做失败并发起重试。

如何过滤重复数据

关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime排重。


申请预制令牌

  1. 为每个申请请求生成一个唯一的标识符,比如UUID。在客户端发起申请时,附加该标识符作为请求的一部分。
  2. 后端接口接收到申请请求后,先检查该标识符是否已经被使用过,如果已经被使用,说明该请求已经被处理过,直接返回之前的结果。
  3. 如果标识符没有被使用过,则进行令牌的预制过程,并将该标识符记录到数据库中或其他持久化存储中,以表示该请求已经被处理过。
  4. 返回申请结果给客户端。

这种方案中,通过唯一标识符来判断请求的唯一性,如果该标识符已经被使用过,则说明该请求已经被处理过,可以直接返回之前的结果,从而实现幂等性。需要注意的是,为了保证幂等性,每次请求都需要携带一个新的唯一标识符,不能重复使用。此外,在实际应用中,还需要考虑并发操作对幂等性的影响,可以使用事务、锁或其他并发控制机制来保证幂等性的正确性。

posted @ 2023-06-23 11:20  广州大雄  阅读(45)  评论(0编辑  收藏  举报