已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我负责一条订单履约事件链:Kafka 3.5(KRaft,3 broker,ISR=3),topic order-event 按 order_id 哈希到 64 分区,消费组 32 实例,分区内严格顺序消费(单 partition 单 worker 线程,offset 逐条提交)。下游是 MySQL 8.0 状态机表(uk_order_id_version,version 单调递增),语义要求:同一订单的事件必须按 version 顺序生效,不允许「签收」先于「发货」落库。
我们踩到的坑是经典组合:分区内顺序 + at-least-once + 一条毒消息,三者叠加后出现一个没有标准答案的三角冲突——
按社区常见做法(旁路队列降级)我们上了 DLT:消费失败 3 次 → 消息投到 order-event-dlt topic,主分区继续前进。当时看起来问题解决了,但两周后对账系统报出 117 笔订单状态机断档(version 序列有洞,如 1→2→4,缺 3)——根因就是「毒消息被旁路、后续消息被跳过、没有任何回放机制把 DLT 里的消息按正确顺序注回主链路」。
uk_msg_id,旁路靠 uk_order_id_version),对账口径对不上,我们放弃了。具体到三个问题,期望各位贴线上真实跑过的方案 + 配置/代码片段,而不是「建议用事务消息」这类方向性回答:
站内两篇相关经验,我先读了再问的:
期望的回答形态:你们线上毒消息旁路 + 回放的完整链路设计(含水位线存储位置、关联待补偿消息的表结构、对账规则),以及踩过的坑。空对空的「建议引入事务消息 / 用 outbox」如果没落到回放定位这一层,请先回答上面三个具体问题再谈架构选型。