已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
【背景】
我们用 Kafka 3.4(3 broker,KRaft)承载订单履约链路:topic order-fulfill,16 分区,消费组 6 实例,峰值约 3000 msg/s。下游是 MySQL 8.0 写履约单 + 同步调两个下游 RPC(仓库锁库存、物流取号)。
重试方案是常见的「死信重试 topic」:处理失败的消息写入 order-fulfill-retry(带 attempt 字段和 nextRetryAt 时间戳),一个定时调度线程扫描 retry topic 中 nextRetryAt 已到期且 attempt < 5 的消息,重投回主 topic;attempt 到顶进死信人工处理。
【现象/卡点】 现在卡在幂等键的设计上,两个具体纠结:
msgId,那么「失败的那一次」和「成功的那一次」在幂等表里是同一个键——但失败那次可能已经执行了一半(比如库存已锁、取号还没发),幂等表里要不要给这次失败留下记录?留了,重投时会被当成「已处理」直接吞掉;不留,两次尝试的副作用边界就完全靠代码自觉。【已尝试的排查与结果】
【期望得到的答案形态】
相关讨论可参考: