🧠 Kafka 八股文面试总结
1. Kafka 的核心组成有哪些?
- Producer:消息生产者,发送消息到 Kafka。
- Consumer:消息消费者,从 Kafka 中消费消息。
- Broker:Kafka 服务器节点,存储消息数据。
- Topic:消息的分类,每个 Topic 下包含多个 Partition。
- Partition:分区,Kafka 的并发和有序性单位。
- Consumer Group:消费者组,保证一条消息被消费一次(每个 group 中只由一个 consumer 消费)。
2. Kafka 的消息发送流程?
- Producer 发送消息到指定 Topic。
- Kafka 根据分区策略选择 Partition。
- 消息写入 Partition 的日志文件。
- Broker 将数据持久化到磁盘。
- Consumer 从 Partition 顺序拉取消息。
3. Kafka 如何保证高吞吐量?
- 批量发送/拉取(Batch)
- 顺序写磁盘(顺序写比随机写快)
- 零拷贝(Zero-Copy)技术
- 文件页缓存(Page Cache)
- 异步 I/O
4. Kafka 的消息投递语义?
- At most once(最多一次) :可能丢,但不重复。
- At least once(至少一次) :不丢,但可能重复。
- Exactly once(恰好一次) :Kafka 0.11+ 提供端到端精确一次语义,需开启幂等和事务。
5. Kafka 如何实现消息的顺序性?
- 同一个 Partition 内消息是有序的。
- 消息顺序依赖分区策略(如:按 key hash 到同一个 partition)。
- 不同 Partition 之间无全局顺序。
6. Kafka 如何实现消费者组负载均衡?
- 一个 Topic 的每个 Partition 在一个消费者组中只能被 一个消费者实例 消费。
- 如果消费者数 > Partition 数,多出的消费者闲置。
- 如果消费者宕机,Kafka 会触发 Rebalance,将其分区分配给其他消费者。
7. Kafka 的消息是如何存储的?
- 每个 Partition 对应一个日志目录,包含一组 log segment 文件。
- 每条消息都带有 offset(偏移量),消费者通过 offset 拉取数据。
- Kafka 定期清理过期数据(基于时间或大小)。
8. Kafka 消息丢失和重复的原因?
- Producer 异常或发送失败重试 → 消息重复。
- Consumer 未提交 offset 就挂了 → 可能重复消费。
- Broker 异常未刷盘 → 消息丢失(异步刷盘模式)。
9. Kafka 的副本机制和高可用?
- 每个 Partition 有一个 Leader,多个 Follower。
- 所有读写都通过 Leader。
- Follower 异步从 Leader 拉取数据并同步。
- 若 Leader 宕机,ISR(In-Sync Replica)中选新 Leader。
10. Kafka 的 Rebalance 机制?
- 当消费者组成员变化时(加入/宕机),Kafka 会重新分配 Partition。
- 使用协调器(Group Coordinator)完成分区分配。
- Rebalance 期间会有短暂不可用。
- Kafka 提供 StickyAssignor 保持分区分配稳定性。
11. Kafka 如何实现事务和幂等?
- 幂等 Producer(Idempotent Producer) :开启
enable.idempotence=true,保证多次发送不会重复写入。 - 事务 Producer:使用
initTransactions、beginTransaction、commitTransaction,配合 Consumer offset 保证 Exactly Once 语义。 - 需使用
transactional.id标识 Producer。
12. Kafka 和 RocketMQ 的对比?
| 对比项 | Kafka | RocketMQ |
|---|---|---|
| 开发语言 | Scala + Java | Java |
| 延迟消息 | 不支持原生延迟,需要配合定时任务实现 | 原生支持延迟等级 |
| 顺序消息 | 分区级顺序 | 支持严格顺序消息 |
| 消息模型 | 基于日志流 | 丰富的消息模型(事务、延迟、顺序) |
| 副本机制 | 高级(ISR,副本控制器) | 支持主从,同步/异步复制 |
| 消息事务 | 0.11+ 支持事务 | 原生事务支持 |
| 社区生态 | 更成熟,生态广 | 阿里系主导,国产支持好 |
13. Kafka 是如何实现高可用的?
- 多副本机制(Leader + Follower)
- Controller 管理 Broker 状态
- Zookeeper(早期)/ Kafka 自建 KRaft(新版本)做元数据管理
- Consumer 自维护 Offset,不影响消费进度
14. Kafka Offset 提交方式?
-
自动提交(enable.auto.commit=true)
- 简单但容易丢消息或重复。
-
手动提交(推荐)
- 更安全,可控制提交时机。
commitSync():阻塞,可靠。commitAsync():异步提交,性能更高但可能失败。
15. Kafka 的 Zero-Copy 是什么?
- 消息从磁盘直接通过 DMA 拷贝到 Socket 缓冲区,绕过用户态。
- 减少上下文切换,提高吞吐。