接口幂等性
什么是幂等性
接口幂等性是指无论调用多少次接口,都只会产生一次结果的特性。在实际开发中,由于网络超时、服务器宕机等原因,会导致客户端重新发送请求,如果接口不具有幂等性,就可能会产生副作用,例如重复插入数据等。
预防重复提交与幂等性的区别
防止重提交接口的表现
- 第一次提交张三工资涨500,数据库update操作,接口返回“操作成功”
- 后续相同请求:拒收请求:张三工资涨500,接口直接返回“请勿重复提交”
幂等性接口的表现
- 第一次提交张三工资涨500,数据库update操作,接口返回“操作成功”
- 后续相同请求:接收请求:张三工资涨500,数据库不做任何写操作,接口返回“操作成功”
幂等问题产生场景
企业微信业务回调-因为网络波动没及时响应-重推机制
618的时候RibbitMQ堆积严重,导致内存爆了,响应不及时,触发了RibbitMQ重试机制,消费了很多重复消息
重复提交
重复提交是指在进行网络请求时,由于网络延迟、用户误操作或其他原因,导致同一个请求被发送多次的情况。这可能会带来一些问题,比如重复插入数据、重复购买等。
幂等性接口设计方案
通过业务数据过滤重复数据
企业微信产生重复回调的场景
企业微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如果企业在调试中,发现成员无法收到被动回复的消息,可以检查是否消息处理超时。
当接收成功后,http头部返回200表示接收ok,其他错误码企业微信后台会一律当做失败并发起重试。
如何过滤重复数据
关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime排重。
申请预制令牌
- 为每个申请请求生成一个唯一的标识符,比如UUID。在客户端发起申请时,附加该标识符作为请求的一部分。
- 后端接口接收到申请请求后,先检查该标识符是否已经被使用过,如果已经被使用,说明该请求已经被处理过,直接返回之前的结果。
- 如果标识符没有被使用过,则进行令牌的预制过程,并将该标识符记录到数据库中或其他持久化存储中,以表示该请求已经被处理过。
- 返回申请结果给客户端。
这种方案中,通过唯一标识符来判断请求的唯一性,如果该标识符已经被使用过,则说明该请求已经被处理过,可以直接返回之前的结果,从而实现幂等性。需要注意的是,为了保证幂等性,每次请求都需要携带一个新的唯一标识符,不能重复使用。此外,在实际应用中,还需要考虑并发操作对幂等性的影响,可以使用事务、锁或其他并发控制机制来保证幂等性的正确性。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步