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 为什么这么快?

高性能三大法宝

  1. 顺序写磁盘
    磁盘顺序写速度 ≈ 内存随机写,远高于随机写。
  2. 零拷贝(Zero-Copy)
    通过 sendfile() 系统调用,数据直接从磁盘 → 网卡,不经过用户态内存
  3. 批量压缩 + 批量发送
    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)或时间滚动。

🔍 查找消息流程

  1. 根据 offset 定位到 Segment;
  2. .index 二分查找物理位置;
  3. .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 StreamsTransactional 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 如何做扩容?

步骤

  1. 新增 Broker 节点;
  2. 使用 kafka-reassign-partitions.sh 工具迁移 Partition;
  3. 触发 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,保证同一用户的操作有序。”


八、附:高频面试题速记清单

  1. Kafka 为什么快? → 顺序写 + 零拷贝 + 批量压缩。
  2. 如何不丢消息? → Producer(acks=all + 幂等)+ Broker(多副本)+ Consumer(手动提交)。
  3. Partition 作用? → 并行 + 扩展 + 局部有序。
  4. Consumer Group 机制? → 一个 Partition 只被 Group 内一个 Consumer 消费。
  5. ISR 是什么? → 同步副本集合,保证可靠性。
  6. Exactly-Once 怎么实现? → 幂等 Producer + 事务。
  7. 如何查消费延迟?kafka-consumer-groups.sh --describe
  8. Kafka vs RabbitMQ? → 吞吐 vs 延迟,Pull vs Push。

💡 终极建议

  • 结合项目讲
    “我们在日志系统中用 Kafka,单 Topic 50 Partition,QPS 20w+……”
  • 提到监控与告警
    “我们用 Burrow 监控 Lag,超过 10w 告警。”
  • 承认边界
    “KRaft 我还没上线,但了解它用 Raft 替代 ZooKeeper……”

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!
👉 下期预告:《Elasticsearch 高频面试 30 问》—— 搜索引擎核心原理全解析!

© 版权声明

相关文章