Kafka 面试专题
概述
本文汇总 Kafka 高频面试题,覆盖架构、副本、存储、生产消费、可靠性、顺序性六大块。每题给出要点式回答与追问方向,帮你系统梳理 Kafka 面试知识。
一、架构类
1.1 Kafka 架构组成?
回答要点:
多 Broker 集群
Topic → Partition → Replica(Leader/Follower)
Controller 管理集群
Producer/Consumer
核心机制:
ISR 副本同步
分区并行
顺序写 + 页缓存 + 零拷贝1.2 Controller 的作用?
回答要点:
分区 Leader 选举
元数据管理
分区重分配
Broker 上下线处理
选举:Raft(KRaft 版本)1.3 Kafka 为什么快?
| 机制 | 说明 |
|---|---|
| 顺序写 | 磁盘顺序追加 |
| 页缓存 | OS 缓存读写 |
| 零拷贝 | sendfile |
| 批处理 | 批量收发 |
| 分区并行 | 水平扩展 |
二、副本与可靠性
2.1 ISR / LEO / HW 是什么?
ISR:与 Leader 同步的副本集合
LEO:副本日志末端偏移
HW:高水位,ISR 最小 LEO
关键点:
消费者只能读到 HW 前
只有 ISR 成员可被选为 Leader
HW 由 Leader 推进2.2 消息可靠性怎么保证?
生产端:
acks=all
enable.idempotence=true(幂等)
重试 + 不丢
Broker 端:
副本 ≥ 2,min.insync.replicas=2
关闭 unclean 选举
消费端:
手动提交 + 幂等消费2.3 Unclean Leader 选举?
定义:ISR 全挂时选非 ISR 副本当 Leader
权衡:
开 → 保可用,可能丢数据
关 → 保数据,可能不可用
生产:核心数据关闭2.4 副本同步机制?
Follower 拉取式同步:
Follower 从 Leader 拉数据
更新本地 LEO
Leader 推进 HW
落后判定:
replica.lag.time.max.ms 超阈值 → 踢出 ISR三、存储类
3.1 Kafka 消息怎么存储?
结构:
Topic → 分区 → Segment(.log/.index/.timeindex)
顺序追加,按 offset 定位
索引:稀疏索引,二分查找 + 顺序扫3.2 零拷贝原理?
传统:磁盘 → 内核 → 用户 → 内核 → 网卡(4 次拷贝)
零拷贝:磁盘 → 内核 → 网卡(sendfile,2 次)
好处:减少拷贝与上下文切换3.3 消息过期怎么处理?
delete 策略:按时间/大小删 Segment
compact 策略:按 key 保留最新值
删除直接删文件(分段的好处)四、生产者与消费者
4.1 分区策略?
默认轮询 / key 哈希 / 指定分区
粘性分区(无 key 时,批量同分区)
顺序性:
同分区有序
全局有序 = 单分区4.2 幂等生产者原理?
PID + 序列号:
生产端分配 PID
每条消息带 seq
Broker 按 PID+分区 去重
局限:单分区,跨会话无效4.3 事务机制?
用途:跨分区原子写 / Exactly-Once
流程:
事务协调器分配事务 ID
开启 → 发送 → 提交/中止4.4 消费组机制?
组内分区分配:
1 分区 = 1 消费者
消费者 > 分区 → 空闲
组间隔离:不同组独立消费4.5 Rebalance 是什么?
触发:加入/退出/故障/分区变化
分配策略:Range / RoundRobin / Sticky
影响:期间暂停消费
协作式:增量分配,减少抖动4.6 位移提交?
存 __consumer_offsets
自动提交:定期(有丢数据风险)
手动提交:处理完再提交(可靠)
核心场景手动提交 + 幂等五、顺序与重复
5.1 怎么保证顺序消费?
同 key → 同分区 → 顺序
实现:
生产端按业务 key 分区
消费端单线程消费分区
全局顺序:单分区 + 单消费者
(牺牲并行度)5.2 怎么避免重复消费?
场景:
Rebalance 位移丢失
提交失败后重平衡
方案:
幂等消费(去重表/唯一键)
手动提交时机控制
事务读-处理-提交5.3 消息丢失的常见原因?
| 环节 | 原因 | 防护 |
|---|---|---|
| 生产 | acks=0/1 | acks=all |
| Broker | 副本=1/unclean | 副本+min ISR |
| 消费 | 自动提交 | 手动提交 |
六、场景题
6.1 消费积压怎么处理?
思路:
先看 Lag 增长速率
消费者数 vs 分区数
单条处理耗时/下游瓶颈
手段:
加消费者(≤ 分区数)
优化处理逻辑/批处理
增加分区数(长期)
先追积压再恢复6.2 怎么保证 Exactly-Once?
端到端精确一次:
读端:Kafka 事务消费(读-处理-提交原子)
写端:幂等 + 事务写入
中间:状态存储事务化
代价:事务开销/吞吐下降
适用:核心金融等场景6.3 大促流量如何保障?
方案:
容量评估(峰值 × 副本放大)
生产者批次调优
消费端横向扩容
监控 Lag + 延迟
积压预案(临时扩容/降级)七、对比类
7.1 Kafka vs RocketMQ vs RabbitMQ?
Kafka:
高吞吐、日志/流场景
分区模型、生态强
RocketMQ:
事务消息、延迟消息、金融场景
可靠性强
RabbitMQ:
灵活路由、低延迟、中小规模
吞吐一般7.2 Kafka vs Pulsar?
Kafka:分区复制、存储与计算耦合
Pulsar:存算分离(BookKeeper)、多租户强
选型:Kafka 生态成熟,Pulsar 云原生/多租户八、避坑与加分
8.1 加分项
加分点:
用自己集群的真实案例
讲清 ISR/HW 的推进细节
讲积压/丢失的排查路径
量化指标(吞吐、延迟)8.2 常见雷区
| 雷区 | 避免 |
|---|---|
| 背概念 | 讲机制与权衡 |
| 只讲单点 | 讲链路 |
| 忽略语义 | 分清 at-most/at-least/exactly |
九、小结
Kafka 面试核心三大块:架构(Controller/分区副本)、可靠性(ISR/Ack/幂等事务)、语义(顺序/重复/积压)。回答时先给结论再讲机制,多用"权衡"视角(可靠 vs 可用、吞吐 vs 延迟),最后落到排查路径与真实场景,就能答得又准又深。