已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
全栈 3 年,最近在 at-least-once 消费链路里做一个「支付结果回查」消费者:单条消息的处理顺序是
问题就出在 1 和 2 之间:RPC 成功、落库前实例被 kill / 超时重启,去重表里没有任何记录,消息重投后步骤 1 会被原样重放——外部副作用已经不可撤销,本地状态机却从头开始。
压测里模拟「RPC 返回后、INSERT 前」注入 200ms 停顿 + kill -9,重投后网关侧出现重复扣减,本地业务表却只有一行。现有去重表是事后登记型(成功才写),对「已发出未确认」的中间态完全失明。
不想要「加个状态机就完事」的结论,希望拿到:
社区已有两篇相关讨论,我读了之后发现它们都没覆盖「RPC 已发出、本地零记录」这个空窗: