外观
一句话答案
三环节保证不丢:生产端确认(acks=all+重试)+ Broker 持久化(同步刷盘/副本)+ 消费端手动 ACK。
核心要点
生产端: 同步发送+重试 / Kafka acks=all Broker: 持久化到磁盘 / 副本同步 消费端: 手动ACK(处理完再确认) / 关闭自动提交offset
端到端: 每一环节都不能丢
追问与易错
追问方向:
- acks=all 会影响性能吗?怎么权衡?(会,对延迟敏感的场景可以用 acks=1)
- 消费者宕机未 ACK 怎么办?(消息会重新投递,需要消费端幂等)
- Broker 磁盘故障怎么保证不丢?(多副本/ISR 机制)
易错点:
- ❌ "acks=all 就绝对不丢"——如果 ISR 只有 Leader 一个副本,效果等于 acks=1
- ❌ "消费完就 commit offset"——应该处理完业务逻辑再 commit
💡 记忆锚点
消息不丢 = 接力赛三棒都不能掉:第一棒生产者(确认送达+重试),第二棒Broker(落盘+多副本),第三棒消费者(干完活再签收)。任何一棒掉了接力棒(消息)就丢了,所以面试要三端一起答。