Apache Kafka
This content is not available in your language yet.
Kafka 把消息系统拆成业务分区日志、KRaft 元数据日志和消费者组状态日志。本册沿着消息追加、复制、提交和消费重平衡的源码路径阅读。
本册问题地图
Section titled “本册问题地图”Kafka 要围绕“日志位置、复制提交、消费分配”三条线同时阅读:
- 分区日志为什么适合吞吐? 每个分区只做顺序追加,读取主要依赖 offset 和稀疏索引,避免为每条消息维护昂贵的随机索引。
- LEO、HW、ISR 分别回答什么? LEO 表示副本写到哪里,ISR 表示哪些副本仍满足追赶条件,HW 表示消费者可安全看到哪里;Leader 写入不等于消息已提交。
- Producer ack 的可靠性边界是什么?
acks=all依赖 ISR 和最小同步副本数;如果副本配置、ISR 收缩或unclean选主策略改变,语义也会改变。 - 消费者为什么不能自己决定 assignment? 组协调器需要看到全组成员和订阅关系,才能让分区所有权在成员间形成一致视图。
- KRaft Controller 做什么? 它用元数据日志和控制器仲裁管理分区、Leader 和配置状态,替代 ZooKeeper 作为 Kafka 元数据外部依赖。
- 零拷贝省掉哪一步? 主要减少 Broker 在内核页缓存与用户态缓冲区之间的重复搬运,但不代表磁盘、网络或副本复制成本消失。
| 项 | 值 |
|---|---|
| 仓库 | apache/kafka |
| 本地路径 | E:\source\java\mq\kafka |
| 分支 | trunk |
| Commit | be0b992d37f309363bb22c6193da64b19a85b51f(2026-08-13) |
| 最近 tag | 0.8.0-beta1(当前浅克隆祖先中的 tag,仅作参考) |
本册源码坐标均基于上述 commit。
| 模块 | 职责 | 关键抽象 |
|---|---|---|
clients |
批次、生产者和消费者协议 | MemoryRecords、AbstractCoordinator |
storage |
分段日志和索引 | UnifiedLog、LocalLog、LogSegment |
core |
Broker、副本和 ISR | ReplicaManager、ReplicaFetcherThread |
raft / metadata |
KRaft 选举和控制器 | KafkaRaftClient、QuorumController |
group-coordinator |
group 和 offset 状态 | GroupMetadataManager |
读码入口顺序
Section titled “读码入口顺序”MemoryRecords/FileRecords:批次和文件读写。UnifiedLog#appendAsLeader→LogSegment#append:消息落盘与索引。ReplicaManager#appendRecords/fetchMessages:leader、follower 和 ISR。KafkaRaftClient→QuorumController:KRaft 控制面。AbstractCoordinator#joinGroupIfNeeded:消费者重平衡。