Kafka 八股题库
这份题库重点是:让你能把 Kafka 讲成你项目里的异步解耦、高峰削峰、实时链路和消费者治理工具,而不是“会发消息”。
一、Kafka 面试里你的最佳定位
你最稳的说法是:
Kafka 在我项目里主要用在推广 ROI 这条线,承担原始事件流转、异步解耦、实时消费和高峰削峰。我的理解重点不是会不会用,而是如何保证链路稳定、幂等、可追踪。
二、高频题
1. Kafka 的核心概念有哪些
必会
- topic
- partition
- broker
- producer
- consumer
- consumer group
- offset
标准理解
Kafka 本质上是一个高吞吐分布式消息系统,适合做日志流、事件流和异步解耦。
2. 为什么 Kafka 吞吐高,零拷贝是什么
标准回答
- 顺序写磁盘
- 批量发送 / 批量拉取
- 零拷贝
- 分区并行
- broker 设计面向吞吐
如果面试官追问零拷贝
Kafka 所说的零拷贝,不是“完全没有任何搬运”,而是尽量减少数据在内核态和用户态之间来回复制的次数。 它通常会利用操作系统的 sendfile 之类机制,把磁盘文件中的数据更直接地送到网卡缓冲区。
传统路径大致是:
- 磁盘 -> 内核页缓存
- 再拷到用户态 buffer
- 再从用户态拷回内核 socket buffer
- 最后发到网卡
零拷贝优化后,broker 不需要先把消息内容读到用户态再写回 socket,减少了:
- CPU copy
- 用户态 / 内核态切换
- 系统调用成本
为什么它和 Kafka 特别搭
因为 Kafka 的消息天然是顺序追加到日志文件里,消费者拉取时,broker 可以把这些顺序文件内容高效送出去。 再配合页缓存、顺序写、批量拉取和分区并行,整体吞吐就会很高。
项目里怎么讲
我理解 Kafka 吞吐高不是只有零拷贝一个点,而是顺序写、page cache、batch、partition 并行和零拷贝一起叠加出来的。面试里如果只背 sendfile 四个字,会显得比较浅。
3. partition 的作用是什么
标准回答
partition 是 Kafka 并行和扩展的基本单位。一个 topic 可以拆成多个 partition,从而让生产和消费并行进行。
常见追问:顺序性怎么保证
Kafka 只能保证单 partition 内有序,跨 partition 不保证全局有序。
4. consumer group 是什么
标准回答
同一个 consumer group 内,同一时刻一个 partition 只能被一个 consumer 消费。这样既能实现并行消费,也能避免同组内重复消费。
5. Kafka 为什么会重复消费
标准回答
因为 Kafka 默认更偏 at-least-once 语义。常见场景:
- 业务处理成功但 offset 还没提交
- 消费者重启
- rebalance
- 提交失败
面试更稳的说法
Kafka 的重点不是“绝不重复”,而是消费端必须做好幂等。
6. 如何保证幂等消费
标准回答
常见做法:
- 业务唯一键
- Redis / DB 幂等校验
- 状态机
- 去重表
更完整一点的做法
如果是核心链路,我更倾向这样做:
- 先定义消息的唯一业务键
- 数据库事件表或消费表加唯一索引
- 主状态更新放事务里
- 积分、权益、账务流水继续做副作用幂等
- 消费失败可重试,但重复消费不能把状态打乱
也就是说,Kafka 层默认允许 at-least-once,真正的稳定性要靠消费端自己兜住。
项目里怎么讲
像行为回传、激活归因、支付类事件,如果 Kafka 消费端不做幂等,重复消费一定会把状态打乱。我一般会先定义唯一业务键,再用数据库唯一约束和状态机兜底,Redis 更多做辅助去重或短期防抖。
7. Kafka 消费失败怎么处理
标准回答
常见策略:
- 立即重试
- 指数退避
- 落错误队列 / 死信队列
- 记录失败日志
- 人工补偿
面试更稳的说法
重试要考虑幂等和故障放大,不能一味重试。
8. 消息积压怎么办
标准回答
先看积压原因:
- 消费速度不够
- 下游依赖慢
- 分区不合理
- 某类消息异常重试过多
再决定:
- 扩 consumer
- 扩 partition
- 优化消费逻辑
- 限流 / 降级
- 拆分 topic
9. 如何保证顺序消费
标准回答
如果业务强依赖顺序,关键数据应路由到同一个 partition,并确保该 partition 在同组内由一个 consumer 顺序处理。
面试更稳的说法
真正需要强顺序的业务不要随便跨 partition 乱分,否则顺序语义就丢了。
10. Kafka 和 RabbitMQ 的核心区别
标准回答
- Kafka 更偏高吞吐日志流 / 事件流
- RabbitMQ 更偏灵活路由、低延迟业务消息、复杂消息模型
面试更稳的说法
Kafka 更像大吞吐事件平台,RabbitMQ 更像传统消息中间件。
11. Kafka 适合什么场景
适合
- 埋点
- 日志流
- 事件流
- 行为数据
- 异步解耦
- 高吞吐消费
不一定适合
- 特别复杂的消息路由
- 极低延迟的小规模业务通知
三、项目里你最适合讲的 Kafka 场景
1. 推广 ROI 链路
- 点击数据流转
- 动态落地页埋点
- 行为事件处理
- 回传链路解耦
2. 为什么这里要用 Kafka
因为:
- 主流程不能被长链路拖死
- 高峰期吞吐大
- 需要重试和积压容忍
- 生产与消费要解耦
3. 你能展示的能力
- 并不是会发消息就够
- 你会考虑顺序、幂等、积压、重试、告警和排障
四、常见追问
追问 1:你项目里 Kafka 放在哪层
你可以答:
Kafka 在我项目里属于事件流转层,前面接原始事件,后面接消费者和处理服务,把主流程和长链路拆开。
追问 2:为什么不用同步处理
你可以答:
因为高峰期吞吐大,而且回传、统计、报表刷新这些不适合同步压在主链路里,否则稳定性会明显变差。
追问 3:Kafka 会不会丢消息
你可以答:
理论上要看 acks、副本和 broker 配置,但业务层即使有 Kafka 也不能完全指望中间件保证一切,关键还是要有幂等、日志和补偿机制。
五、你复习 Kafka 最该背的 10 个点
- topic / partition / consumer group
- Kafka 为什么吞吐高与零拷贝
- partition 顺序性
- offset
- 重复消费
- 幂等消费
- 消费失败处理
- 消息积压
- Kafka 和 RabbitMQ 区别
- 项目里为什么要用 Kafka