全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《Java 消息中间件·Kafka 内核与客户端》 |
| 篇数 | 50 篇(15 章 45 节 + 序、前言、目录 + 附录 A/B) |
| 领域 | 分区日志、副本与选举、KRaft、位移与消费组协议、客户端源码、存储与性能、运维与故障 |
| 贯穿项目 | libraryd-mq —— 把图书馆的借阅、归还、预约、逾期做成一条条可追踪的消息 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按机制跳读 |
| 主线版本 | JDK 25 LTS(Temurin 25.0.5+8)、Kafka 4.3.0(KRaft only) |
| 关键依赖 | kafka-clients 4.3.0、kafka-streams 4.3.0(卷三)、colima 容器(Docker 29.5.2) |
| 上级专题 | 书稿专题 |
三卷分工
| 卷 | 书名 | 关注点 |
|---|---|---|
| 卷一 | 《Java 消息中间件·Kafka 内核与客户端》 | 一条消息从 send 到落盘发生了什么 |
| 卷二 | 《Java 消息中间件·可靠消息与消费治理》 | 怎么做到不丢、不重、可恢复 |
| 卷三 | 《Java 消息中间件·事件驱动架构》 | 怎么用事件设计系统 |
本卷不展开业务幂等与架构范式,需要时写「卷二第 N 章」「卷三第 N 章」。
全书目录
前置
| 篇 | 文章 | 核心内容 |
|---|---|---|
| — | 序:消息系统里没有魔法 | 三个误判、验证方式、三卷分工 |
| — | 前言:实验环境、集群与数据口径 | 单节点与三节点底座、版本、数据标注规则 |
| — | 目录与学习路径 | 三条路径、五部分、与卷二卷三衔接 |
第一部分:消息系统与实验底座(第 1–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 1.1 把消息系统看成日志 | 四种形态、为什么选分区日志、位移是读者进度 |
| 1.2 | 1.2 分区:顺序与并行度的交换 | 分区即并行单位也是顺序单位、跨分区无全局序 |
| 1.3 | 1.3 交付语义的真实成本 | 三档语义、各自需要的配置、恰好一次的边界 |
| 2.1 | 2.1 三个节点的最小集群 | compose 文件、listener 与 advertised 的区别 |
| 2.2 | 2.2 Topic 的物理结构 | 段文件、稀疏索引、一次读请求的寻址 |
| 2.3 | 2.3 保留与清理 | delete 与 compact、墓碑、最新状态语义 |
| 3.1 | 3.1 批次、linger 与压缩 | 三个参数的相互作用、批次级压缩 |
| 3.2 | 3.2 acks、重试与幂等 | 失败窗口、PID 与 sequence、超时关系 |
| 3.3 | 3.3 分区器与键设计 | 粘性分区、自定义分区器、热点 key |
第二部分:服务端机制(第 4–6 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 4.1 副本、LEO 与高水位 | 三个量的关系、消费者只能读到 HW 之前 |
| 4.2 | 4.2 ISR 收缩与 min.insync.replicas | ISR 判定、与 acks=all 的联合门槛 |
| 4.3 | 4.3 Leader 选举与不干净选举 | 优先副本、受控关闭、ELR |
| 5.1 | 5.1 KRaft:控制器与元数据日志 | 去掉 ZooKeeper 的原因、元数据即日志 |
| 5.2 | 5.2 集群成员与元数据传播 | broker 注册、leader 变更的传播延迟 |
| 5.3 | 5.3 客户端的元数据刷新 | Metadata 状态机、过期导致的抖动 |
| 6.1 | 6.1 位移与 __consumer_offsets | 位移存哪、提交位移与消费位置的区别 |
| 6.2 | 6.2 经典再平衡协议 | JoinGroup/SyncGroup、eager 与 cooperative |
| 6.3 | 6.3 KIP-848 新一代协议 | 服务端主导分配、group.protocol、迁移注意 |
第三部分:客户端源码(第 7–9 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 7.1 | 7.1 KafkaProducer 的线程模型 | 调用线程 + Sender 单线程、send 做了什么 |
| 7.2 | 7.2 RecordAccumulator 与批次缓存 | 分区 deque、BufferPool、max.block.ms |
| 7.3 | 7.3 Sender 与 NetworkClient | 请求拆分、in-flight、连接状态机 |
| 8.1 | 8.1 KafkaConsumer 的两套实现 | Classic 与 Async、group.protocol 的实际分支 |
| 8.2 | 8.2 Fetcher 与拉取管线 | poll 的完整路径、fetch 参数 |
| 8.3 | 8.3 ConsumerCoordinator 与位移提交 | 自动提交时机、同步与异步提交 |
| 9.1 | 9.1 序列化器与 Schema 边界 | 内置序列化器、消息里不要放可变对象 |
| 9.2 | 9.2 拦截器链与埋点 | 能改什么、不能改什么 |
| 9.3 | 9.3 客户端指标口径 | 77 项指标怎么读、哪些反映背压 |
第四部分:存储与性能(第 10–12 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 10.1 | 10.1 顺序写、页缓存与零拷贝 | 顺序追加为什么快、sendfile 路径 |
| 10.2 | 10.2 段滚动、索引重建与恢复 | 滚动条件、崩溃后的索引重建 |
| 10.3 | 10.3 磁盘与文件描述符规划 | 容量估算、fd、IO 线程 |
| 11.1 | 11.1 网络线程与请求队列 | network 与 io 线程、mute/unmute |
| 11.2 | 11.2 副本同步的吞吐与延迟 | follower fetch、跨机架流量 |
| 11.3 | 11.3 分区数的非线性成本 | fd、内存、选举与重平衡时间 |
| 12.1 | 12.1 官方压测工具与方法论 | 两个 perf-test 脚本、本机负载下的可信度 |
| 12.2 | 12.2 吞吐、延迟与持久性的三角 | 三个指标互相挤压的关系 |
| 12.3 | 12.3 容量规划 | 从 QPS 推分区数与保留期 |
第五部分:运维与故障(第 13–15 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 13.1 | 13.1 集群拓扑与机架感知 | broker.rack、跨 AZ 流量代价 |
| 13.2 | 13.2 滚动重启与最小可用 | 重启顺序、受控关闭、重启窗口 |
| 13.3 | 13.3 副本重建与限流 | 追赶、lag.time.max、重建限流 |
| 14.1 | 14.1 故障图谱 | URP、离线分区、磁盘满、fd 耗尽 |
| 14.2 | 14.2 积压的分层定位 | 从 lag 到根因的判定路径 |
| 14.3 | 14.3 数据不一致的取证 | 副本比对、段文件取证 |
| 15.1 | 15.1 监控指标与告警 | 必看的 12 个指标与阈值 |
| 15.2 | 15.2 版本升级与兼容性 | 协议兼容、升级顺序 |
| 15.3 | 15.3 libraryd-mq 卷一验收 | 场景、判据、实测记录 |
附录
| 篇 | 文章 | 核心内容 |
|---|---|---|
| A | 附录 A Kafka 命令速查 | 集群、主题、消费组、日志、压测五组命令 |
| B | 附录 B 集群与客户端模板 | compose、客户端模板、metrics 打点 |
三条阅读路径
| 路径 | 适合谁 | 怎么走 |
|---|---|---|
| 顺序通读 | 想建立完整的机制理解 | 1.1 → 15.3,约 30 小时 |
| 机制跳读 | 已在用 Kafka,想补原理 | 第 1、4、6、7、8 章 |
| 运维查表 | 正在处理集群问题 | 附录 A + 第 14 章 + 15.1 |
相关专题
- 《Java 消息中间件·可靠消息与消费治理》 —— 本卷续篇,讲不丢不重
- 《Java 消息中间件·事件驱动架构》 —— 本卷续篇,讲架构范式
- 《Java 并发编程·性能诊断与事故》 —— 并发与延迟诊断的姊妹篇
- 书稿专题 —— 全部电子书