Kafka 面试高频题(原理辨析・背诵版)
Kafka 面试高频题(原理辨析·背诵版)
覆盖你要的 HW&LEO、ISR、分区策略、零拷贝&mmap,附高频扩展题,全是面试常问核心
一、核心概念辨析(必问)
1. HW(高水位)和 LEO(日志末端偏移)的区别?
【面试题】解释 HW、LEO,以及两者的作用和差异
答案
- LEO(Log End Offset):副本(Leader/Follower)本地日志下一条待写入的偏移量,代表副本自身最新写入位置。
- HW(High Watermark):所有 ISR 副本 LEO 的最小值,代表已成功提交、消费者可读取的最大偏移量。
- 关键区别
- LEO 是单副本维度,HW 是分区(ISR集合)维度;
- 消费者只能读 HW 之前的消息,HW 后未同步完成的消息不可见;
- Follower 同步追上 Leader LEO,HW 才会推进。
2. ISR 是什么?机制&作用?为什么只从 ISR 选 Leader?
【面试题】ISR 全称、判定规则、核心作用
答案
- ISR(In-Sync Replicas):与 Leader 保持同步的副本集合(包含 Leader 自身)。
- 同步判定:Follower 在
replica.lag.time.max.ms内能追上 Leader,就留在 ISR;超时则踢出。 - 核心作用:保证数据一致性 + 快速故障转移。
- 只从 ISR 选 Leader 的原因:ISR 内副本数据是最新、完整的,非ISR副本数据滞后,选举会导致数据丢失/不一致。
3. 分区(Partition)核心作用?单分区/全局有序性?
答案
- 作用:水平扩展、并行读写,是 Kafka 高吞吐基础;副本以分区为单位冗余。
- 有序性:单分区内严格 FIFO 有序,跨分区全局无序(要全局有序需 Topic 只设1个分区)。
二、生产端高频(ACK、分区策略、可靠性)
1. acks 三种配置区别?场景选型?
答案
acks=0:生产者发完不等待确认,最高吞吐、最低可靠(Leader宕机消息丢失)。acks=1:等待 Leader 本地落盘即确认,折中(Leader宕机、Follower未同步会丢消息)。acks=all/-1:等待所有 ISR 副本同步完成,最高可靠(性能略低)。- 选型:金融/支付用
all,日志采集/监控用0或1。
2. 生产者分区策略有哪些?怎么选型?
答案
- 轮询(RoundRobin):默认,消息均匀分布所有分区,无 Key 场景适用。
- 哈希(Default):按 Key 哈希取模分区,同 Key 消息进入同一分区(保证单分区有序)。
- 粘性分区(Sticky):批量发送时尽量发往同一分区,提升批量效率。
- 自定义:实现
Partitioner接口,按业务规则路由。 - 选型:需要 Key 有序 → 哈希;纯吞吐、无顺序要求 → 轮询/粘性。
3. Kafka 幂等生产者 & 事务原理?解决什么问题?
答案
- 幂等:PID(生产者ID)+ 分区 + 序列号,Broker 去重,解决重复发送、网络重传导致的消息重复。
- 事务:跨分区/会话原子性写入,要么全部提交,要么全部回滚,配合幂等实现Exactly-once(精确一次) 语义。
三、消费端高频(Rebalance、消费语义、Offset)
1. 消费者组(Consumer Group)核心规则?Rebalance 触发条件?
答案
- 规则:一个分区只能被组内一个消费者消费;消费者数 ≤ 分区数(多了空闲)。
- Rebalance 触发:消费者上下线、Topic 分区增减、订阅关系变化。
- 问题:重平衡期间消费者不可读,频繁重平衡会导致性能暴跌。
2. 三种消费语义(At-most/At-least/Exactly-once)?
答案
- 最多一次(At-most-once):先提交 Offset,再处理消息 → 可能丢消息,无重复。
- 至少一次(At-least-once):先处理消息,再提交 Offset → 不丢消息,可能重复(需业务幂等)。
- 精确一次(Exactly-once):生产者幂等 + 事务 + 消费者事务提交 Offset → 不丢不重,最强语义。
3. Offset 存哪里?自动/手动提交区别?
答案
- 存储:新版默认存内部主题
__consumer_offsets(弃用 ZK)。 - 自动提交:定时提交,简单但不可控,易丢/重消息。
- 手动提交:
commitSync(同步阻塞)/commitAsync(异步非阻塞),业务可控,生产环境推荐。
四、高性能原理(零拷贝、mmap、顺序写)
1. 零拷贝是什么?和传统拷贝区别?Kafka 为什么用它?
答案
- 零拷贝(
sendfile):数据直接从内核页缓存 → Socket 缓冲区,跳过用户态拷贝,减少CPU开销。 - 传统拷贝:磁盘→内核缓存→用户缓存→Socket缓存(4次拷贝、2次上下文切换)。
- 零拷贝:磁盘→内核缓存→Socket(2次拷贝、1次切换),读性能大幅提升。
2. 零拷贝 和 mmap(内存映射)的区别?Kafka 如何用?
【高频辨析题】
答案
| 特性 | mmap | 零拷贝(sendfile) |
|---|---|---|
| 作用 | 把磁盘文件映射到进程地址空间 | 内核态直接转发数据到网卡 |
| 适用场景 | Kafka 索引文件(.index/.timeindex) | Kafka 消息日志(.log)读取 |
| 拷贝次数 | 减少用户态拷贝,但仍需CPU参与 | 完全无CPU拷贝,纯DMA传输 |
| 安全/限制 | 映射文件过大可能OOM | 适合大文件流式读取,无内存压力 |
- 总结:mmap 用于索引加速,零拷贝用于消息读取,两者配合实现高性能。
3. Kafka 为什么快?核心高性能设计(必背总结)
答案
- 分区并行,分布式读写;
- 顺序追加写,避免磁盘随机IO瓶颈;
- 依赖操作系统 PageCache,异步刷盘;
- 生产者批量发送+消息压缩;
- 消费者零拷贝读取;
- 拉模式(Consumer主动拉),适配不同消费速率。
五、高可用机制(副本、Leader选举、故障恢复)
1. Leader/Follower 职责?Leader 宕机如何选举?
答案
- Leader:处理所有读写请求;
- Follower:只同步数据,不对外提供服务。
- 选举规则:从 ISR 中选 LEO 最大的 Follower 为新 Leader,保证数据最新、不丢失。
2. 旧 Leader 恢复后会怎样?如何保证数据一致?
答案
旧Leader恢复后变为Follower,截断自己超出 HW 的数据,再同步新Leader数据,避免数据不一致。
六、架构对比(ZK vs KRaft)
1. 传统 ZK 架构 vs KRaft 新架构(去ZK)区别?
答案
- ZK 架构:依赖外部 ZK 存元数据、选Controller,部署重、网络抖动影响大。
- KRaft 架构:内置 Raft 协议 管理元数据,自选举Controller,无外部依赖,部署简单、延迟更低、扩展性更好(Kafka 2.8+ 主推)。
七、一句话高频速答(面试收尾/口头回答)
- Kafka 本质:分布式追加日志系统,靠分区扩吞吐、副本保高可用。
- 数据可靠核心:ISR + HW + acks=all。
- 高性能核心:顺序写 + PageCache + 零拷贝 + 批量压缩。
- 消费核心:消费者组 + 单分区独占 + Offset 提交。
需要我把这些题再压缩成1页纸极简背诵版(只留题干+关键词)吗?
浙公网安备 33010602011771号