Kafka 高频面试 40 问(2025 最全版):从架构原理到生产调优,一篇通杀!
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!
Kafka 是高吞吐、分布式、持久化的消息中间件,被广泛用于日志收集、实时计算、事件驱动架构。
但面试官不会只问“Kafka 是什么”——他们要的是你对 分区机制、副本同步、Exactly-Once、性能调优、故障恢复 的深度理解。
本文系统整理 40 道高频 Kafka 面试题,按模块分类 + 深度解析 + 反例 + 注意事项,助你轻松拿下消息队列环节!
一、基础篇:别在概念上翻车
Q1:Kafka 的核心组件有哪些?
✅ 四大核心组件:
- Producer:生产者,发送消息;
- Broker:Kafka 服务节点,存储消息;
- Consumer:消费者,拉取消息;
- ZooKeeper / KRaft(Kafka Raft):管理集群元数据(Kafka 3.3+ 已支持去 ZooKeeper)。
💡 演进趋势:
Kafka 正在 移除对 ZooKeeper 的依赖,使用内置的 KRaft 模式(基于 Raft 协议)管理元数据。
Q2:Kafka 为什么这么快?
✅ 高性能三大法宝:
-
顺序写磁盘:
磁盘顺序写速度 ≈ 内存随机写,远高于随机写。 -
零拷贝(Zero-Copy):
通过sendfile()系统调用,数据直接从磁盘 → 网卡,不经过用户态内存。 -
批量压缩 + 批量发送:
Producer 批量攒消息,减少网络请求;支持 gzip/snappy/lz4 压缩。
❌ 反例回答:
“因为它是用 Scala 写的所以快” → 技术栈和性能无关!
二、架构与存储篇
Q3:Partition(分区)的作用是什么?
✅ 核心作用:
- 水平扩展:一个 Topic 可拆成多个 Partition,分布到不同 Broker;
- 并行消费:一个 Consumer Group 中,每个 Partition 只能被一个 Consumer 消费;
- 保证局部有序:同一个 Partition 内消息有序(但全局无序)。
🎯 关键结论:
Partition 数 = Consumer 并发上限!设太少会限制吞抗能力。
Q4:消息在磁盘上怎么存储的?
✅ 存储结构:
- 每个 Partition 对应一个目录(如
topic-0/); - 目录下包含多个 Segment 文件(
.log数据文件 +.index偏移索引 +.timeindex时间索引); - Segment 按大小(默认 1GB)或时间滚动。
🔍 查找消息流程:
- 根据 offset 定位到 Segment;
- 用
.index二分查找物理位置; - 从
.log读取数据。
💡 优势:避免单文件过大,便于清理过期数据(直接删旧 Segment)。
三、生产者(Producer)篇
Q5:Producer 发送消息有哪几种模式?
| 模式 | acks 参数 | 可靠性 | 吞吐 |
|---|---|---|---|
| 最多一次 | acks=0 |
❌ 可能丢 | ⚡ 最高 |
| 至少一次 | acks=1 |
✅ 不丢(但可能重复) | 高 |
| 精确一次 |
acks=all + 幂等/事务 |
✅ Exactly-Once | 中 |
✅ 生产建议:
- 日志类:
acks=1; - 订单类:
acks=all+ 幂等(enable.idempotence=true)。
Q6:如何保证消息不丢失?
✅ 全链路保障:
| 环节 | 配置 |
|---|---|
| Producer |
acks=all, retries=Integer.MAX_VALUE, enable.idempotence=true
|
| Broker |
replication.factor >= 3, min.insync.replicas = 2
|
| Consumer | 手动提交 offset(处理完再 commit) |
⚠️ 反例:
“只要 Producer 发成功就不会丢” → 如果 Broker 只有一个副本且宕机,照样丢!
Q7:什么是幂等 Producer?如何实现?
✅ 幂等性:
即使重试多次,Broker 也只保留一条消息。
🔧 实现原理:
- 每个 Producer 有唯一
PID(重启会变); - 每条消息带
sequence number; - Broker 为每个
<PID, Partition>维护序列号,拒绝重复或乱序消息。
📌 注意:幂等性仅保证单 Partition 单会话内 Exactly-Once,跨 Partition 或重启后失效。
四、消费者(Consumer)篇
Q8:Consumer Group 是什么?有什么作用?
✅ 核心机制:
- 多个 Consumer 组成一个 Group,共同消费一个 Topic;
- Kafka 保证 每个 Partition 只分配给 Group 内一个 Consumer;
- 实现 负载均衡 + 容错(Consumer 挂了,Partition 会 reassign)。
🎯 应用场景:
- 广播:每个服务实例独立消费 → 不同 Group;
- 负载均衡:多个实例分摊消费 → 同一个 Group。
Q9:Offset 提交方式有哪些?如何避免重复/丢失?
| 方式 | 说明 | 风险 |
|---|---|---|
| 自动提交(enable.auto.commit=true) | 定时提交(如每 5 秒) | 处理中宕机 → 重复消费 |
| 手动提交(commitSync / commitAsync) | 业务处理完再提交 | 忘记提交 → 重复;提交太早 → 丢失 |
✅ 最佳实践:
while (true) {
ConsumerRecords records = consumer.poll(Duration.ofMillis(100));
for (Record record : records) {
process(record); // 处理消息
}
consumer.commitSync(); // 全部处理完再同步提交
}
💡 高级方案:处理一条提交一条(需配合幂等消费)。
五、可靠性与一致性篇
Q10:Kafka 如何实现 Exactly-Once 语义?
✅ 两种场景:
1. Producer → Kafka(单写)
- 开启幂等:
enable.idempotence=true - 自动设置
acks=all,retries>0
2. Kafka → Kafka(流处理)
- 使用 Kafka Streams 或 Transactional Producer
- 通过 事务 保证“读-处理-写”原子性
// 事务示例
producer.initTransactions();
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction(); // 要么全成功,要么全失败
📌 注意:Exactly-Once 需要 Producer + Broker + Consumer 全链路配合。
Q11:ISR(In-Sync Replicas)是什么?
✅ 定义:
与 Leader 保持同步的 Follower 集合。
🔧 工作机制:
- Leader 维护 ISR 列表;
- Follower 超过
replica.lag.time.max.ms(默认 30s)未同步 → 踢出 ISR; -
acks=all时,只需 ISR 中所有副本确认即可。
🎯 意义:
避免因慢 Follower 拖慢写入,同时保证数据可靠性。
六、集群与运维篇
Q12:Kafka 如何做扩容?
✅ 步骤:
- 新增 Broker 节点;
- 使用
kafka-reassign-partitions.sh工具迁移 Partition; - 触发 rebalance,流量自动分摊。
⚠️ 注意:
扩容后需手动均衡 Partition,否则新节点空闲!
Q13:如何监控 Kafka?
✅ 关键指标:
| 指标 | 工具 |
|---|---|
| Broker CPU/IO | Prometheus + Grafana |
| Topic Lag(消费延迟) | kafka-consumer-groups.sh --describe |
| Under Replicated Partitions | JMX 指标(应为 0) |
| Request Handler Idle | 应 > 20%(否则处理不过来) |
🔧 常用命令:
# 查看消费组延迟
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--group my-group --describe
# 查看 Topic 详情
bin/kafka-topics.sh --describe --topic orders
七、高级特性与陷阱题
Q14:Kafka 和 RabbitMQ 有什么区别?
| 特性 | Kafka | RabbitMQ |
|---|---|---|
| 设计目标 | 高吞吐、日志流 | 低延迟、复杂路由 |
| 消息模型 | Pull(消费者拉) | Push(Broker 推) |
| 持久化 | 强(磁盘顺序写) | 可选 |
| 事务 | 支持(Exactly-Once) | 支持(AMQP 事务) |
| 适用场景 | 大数据、实时数仓 | 任务队列、RPC |
✅ 总结:
- 大数据/日志 → Kafka;
- 业务解耦/任务调度 → RabbitMQ。
Q15:什么是 Log Compaction?适用场景?
✅ 原理:
保留每个 key 的最新值,删除旧版本(类似数据库 snapshot)。
🎯 适用场景:
- 用户资料变更流(只需最新状态);
- 配置中心更新;
- CDC(Change Data Capture)。
⚠️ 注意:Topic 需设置
cleanup.policy=compact。
Q16:Kafka 能保证全局有序吗?
❌ 不能!
只能保证 单 Partition 内有序。
✅ 如果业务需要全局有序:
- Topic 只设 1 个 Partition(牺牲并发);
- 或在消息中加 业务 ID,由消费者合并排序(复杂)。
📌 面试话术:
“我们通过业务主键 hash 到固定 Partition,保证同一用户的操作有序。”
八、附:高频面试题速记清单
- Kafka 为什么快? → 顺序写 + 零拷贝 + 批量压缩。
- 如何不丢消息? → Producer(acks=all + 幂等)+ Broker(多副本)+ Consumer(手动提交)。
- Partition 作用? → 并行 + 扩展 + 局部有序。
- Consumer Group 机制? → 一个 Partition 只被 Group 内一个 Consumer 消费。
- ISR 是什么? → 同步副本集合,保证可靠性。
- Exactly-Once 怎么实现? → 幂等 Producer + 事务。
-
如何查消费延迟? →
kafka-consumer-groups.sh --describe。 - Kafka vs RabbitMQ? → 吞吐 vs 延迟,Pull vs Push。
💡 终极建议
-
结合项目讲:
“我们在日志系统中用 Kafka,单 Topic 50 Partition,QPS 20w+……” -
提到监控与告警:
“我们用 Burrow 监控 Lag,超过 10w 告警。” -
承认边界:
“KRaft 我还没上线,但了解它用 Raft 替代 ZooKeeper……”
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!
👉 下期预告:《Elasticsearch 高频面试 30 问》—— 搜索引擎核心原理全解析!