机房一台 broker 电源故障,恢复后核对发现 3200 条支付成功消息在 topic 里查不到,生产端日志全部是成功的 send 回调。乍看像缓存或者权限的锅,追下去往往不是。

# producer.properties
acks=all
retries=3
enable.idempotence=true
# server.properties
unclean.leader.election.enable=false

追下去是这么回事:acks=1 只等 leader 写入页缓存就返回成功,follower 还没复制,leader 掉电后这段数据丢失。副本数 3 也挡不住这种配置下的单点确认。

「Kafka acks 丢消息」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

具体做法是,把关键 topic 的 acks 改成 all 生产端同步调整;配合 min.insync.replicas=2 让确认真正落到两个副本;关闭 unclean.leader.election.enable 避免落后副本当 leader;按订单号从业务库补发缺失的 3200 条。

验收就看一点,模拟杀掉 leader 后重启 生产端出现重试日志 消费端条数与业务库一致。

作者 9823189