生产反馈订单消息偶尔丢失,你会按生产者、Broker 和消费者三段怎么排查?
我的判断
订单消息疑似丢失要用业务 eventId 沿生产者、Broker 和消费者逐段查证,不能先凭 lag 或日志猜是哪一层。
我会选一笔明确缺失的订单,拿到 eventId、Topic、key 和大致发送时间。生产者侧查发送回调:是否进入 outbox、调用 send 是否成功、返回的 partition/offset 是多少,超时后有没有错误地当成功。
Broker 侧根据 partition/offset 检查日志与保留策略,核对当时 ISR 收缩、Leader 切换、acks、min.insync.replicas 和 unclean election。如果生产者拿到成功 offset,但该位置后来不存在,才重点怀疑副本与选主配置。
消费者侧查该组 offset 是否已经越过消息、反序列化是否失败、过滤条件是否误丢、业务事务失败后是否仍提交位点。很多“Kafka 丢消息”其实是消费代码 catch 后提交,或写库成功但查询侧数据不一致。
止损会暂停可疑位点推进、保存日志,在隔离环境按 eventId 重放。修复后建立生产发送数、Broker 记录数、业务成功数和死信数的对账。
01业务事务
→02生产者发送
→03Leader 写入
→04Follower 同步
→05消费者拉取
容易答偏踩坑误区
- 只看 consumer lag 为 0。 它只能说明位点追上,不说明业务处理成功。
- send 没抛异常就算成功。 异步发送必须检查回调或 Future。
- 直接重置整个消费组重放。 没有幂等时会制造更大范围重复。