已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】
我们做账户余额变动这条链路:Kafka 3.5(3 broker),topic account-credit 24 分区,生产端用 transactional producer(PID 前缀 acct-,transaction.timeout.ms=60000)。业务路径是「读账户表 → 算新余额 → 写账户表 + 写 outbox 表(同库同事务)→ Debezium CDC 把 outbox 投递到 Kafka」。消费端 12 实例消费 account-credit,做两件事:写下游对账表(MySQL 8.0)+ 发短信通知。
【现象】 Debezium 是 at-least-once 投递,下游偶发收到重复消息(同一条 outbox 记录被投递 2 次,单 msgKey 的重复率我们采样到约 0.3%)。我们消费端原本没有幂等,直接后果:对账表出现重复行、短信重复发送(客诉 3 起)。
【已尝试的排查与结果】
【期望得到的答案形态】 希望有同学在「下游是 MySQL(不是 Kafka sink)+ Debezium at-least-once」这个前提下,给一套具体到代码结构和索引设计的幂等方案:
如果能给一个最小 PoC(1 个 topic / 2 实例 / 注入 0.3% 重复投递 + 短信 mock)就更好。