接口幂等设计实战手册:从重复下单到消息重投,把重复请求一次挡住

线上最难查、也最容易被低估的一类问题,不是服务挂了,而是「同一件事被做了两遍」。用户点了两下提交按钮,订单生成了两笔;支付平台回调发了三次,余额充了两回;消息中间件重启后重投,优惠券发了两张。服务没有报错,日志里每一条都写着成功,等到财务对账或者客服接到投诉时,钱已经付出去了。

这类问题的共同名字叫「幂等没做对」。幂等的意思是:同一个请求执行一次和执行很多次,对系统产生的结果完全一样。听起来简单,真做起来几乎每个团队都会在同一个地方栽跟头——不是没做去重,而是去重做在了错误的层次上。

一、先搞清楚:重复到底从哪里来

很多人一提幂等就想到「用户手抖点两下」,这其实是最不重要的一种来源。真正高频的重复来自系统自身,而且它们有一个共同特征:发起方根本不知道上一次有没有成功。

  • 网络超时后的自动重试。 客户端发出请求,服务端其实已经处理完了,但响应在回程路上丢了。客户端只看到超时,于是再发一次。这是重复的最大来源,也是唯一无法靠「提醒用户别点两下」解决的来源。
  • 网关和负载均衡的重试。 不少网关默认配置了失败重试,上游超时就换一个节点再发。业务代码完全不知情,日志里却会凭空多出一次调用。
  • 消息重投。 消费者处理成功但没来得及提交位点,或者消费超时被判定失败,消息会再次投递。消息队列保证的是「至少一次」,不是「恰好一次」

🔒 登录后查看全文

登录后即可查看完整内容