KafkaNotes

第 01 章:认识 Kafka

zjc 于 2026-01-01 发布

这是《Kafka 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。

1.1 从一个真实痛点说起

假设你在一个电商公司负责订单系统。用户下单后,系统要做很多事:扣库存、生成物流单、发积分、发短信、写风控日志、同步数据仓库。

最直接的做法是订单服务在事务里依次调用这些下游接口:

用户下单 -> 订单库 -> 扣库存 -> 物流 -> 积分 -> 短信 -> 数仓

很快你会遇到一堆麻烦:

这些问题的本质是:同步调用把“产生事件”和“处理事件”绑死了

Kafka 解决的正是这件事——订单系统只负责把“订单已创建”这个事实写下来,下游各自订阅、各自消费、各自重试,互不拖累。这个“写字的地方”,就是 Kafka。

1.2 Kafka 是什么

Apache Kafka 是一个分布式事件流平台(distributed event streaming platform)。这句话拆开看有三层含义:

  1. 发布/订阅消息流:像消息队列一样,生产者写消息,消费者读消息,实现系统解耦与异步通信;
  2. 存储消息流:消息以分布式、多副本、可容错的提交日志形式持久化在磁盘上,可以按需保留几分钟或 forever;
  3. 处理消息流:通过 Kafka Streams、ksqlDB 等组件,实时对流式数据做转换、聚合、关联。

注意第三点:Kafka 不只是“队列”,它是以日志为核心的流式基础设施。这个定位贯穿全书。

1.3 Kafka 的诞生与演化

Kafka 诞生于 LinkedIn,2010 年左右开发,2011 年开源,2012 年成为 Apache 顶级项目。名字来源于捷克作家弗朗茨·卡夫卡(Franz Kafka),据说是因为开发者喜欢这位作家,而且这个名字读起来朗朗上口。

LinkedIn 当时的痛点很典型:需要一套能处理海量活动数据(页面浏览、搜索、用户行为)的管道,当时的消息系统要么吞吐不够,要么不支持长时间保留数据。Kafka 的设计目标因此非常明确:高吞吐、可水平扩展、持久化、多订阅者

版本演进中的关键节点:

版本 时间 关键特性
0.7 2011 初始开源版本
0.8 2013 引入副本机制,具备容错能力
0.9 2015 安全机制、Kafka Connect
0.10 2016 Kafka Streams,流处理框架
0.11 2017 幂等生产者、事务、消息头、V2 消息格式
1.x/2.x 2017-2021 性能与稳定性持续增强,2.4 引入协作式再平衡
2.8 2021 KRaft 早期访问,开始替代 ZooKeeper
3.3 2022 KRaft 生产可用
3.5 2023 ZooKeeper 模式标记为废弃
4.0 2025 彻底移除 ZooKeeper,KRaft 成为唯一模式

本书以 KRaft 模式为主线,第 16 章会专门讲这套新架构。老公司里仍然存在 ZooKeeper 模式集群,所以书中涉及差异时会单独提示。

1.4 消息中间件要解决的四件事

1. 解耦

生产者不需要知道谁会消费消息。订单系统只管发布 order-created 事件,下游想加多少订阅者都行,订单系统代码零改动。

2. 异步

耗时的操作从主链路里挪出去。下单接口只需确保消息写入 Kafka(毫秒级),发短信、算积分这些慢操作由消费者异步完成,接口响应时间大幅下降。

3. 削峰填谷

秒杀开始瞬间每秒 10 万请求,数据库只能承受每秒 2 万写入。让请求先写入 Kafka,消费者按数据库能承受的速度平稳消费,系统在洪峰下依然稳定。

4. 缓冲与重放

消息被持久化保留,下游故障恢复后可以从上次位置继续消费,甚至把位移重置到过去,重新处理历史数据。这是 Kafka 与很多传统队列最大的区别:消费不删除数据,删除只由保留策略决定

1.5 Kafka 与传统消息队列的对比

维度 Kafka RabbitMQ ActiveMQ Pulsar
模型 分布式提交日志 经典 AMQP 代理 JMS/AMQP 分层(BookKeeper)
吞吐 极高(百万级/s 常见) 中等 中等
消息保留 按时间/大小长期保留 消费即删除(可配置) 可配置 分层存储
回放 天然支持,按 offset 较弱 较弱 支持
顺序 分区内严格有序 队列内有序 队列内有序 分区内有序
生态 流处理/大数据最强 传统企业集成 传统企业 云原生、多租户
延迟 毫秒级 微秒到毫秒级 毫秒级 毫秒级

选型上一句话概括:需要海量数据管道、流处理、日志与事件流,选 Kafka;需要复杂的路由规则、极低延迟的传统消息投递,RabbitMQ 也值得考虑。现实中 Kafka 的生态位更接近“数据中枢”,而不仅是 MQ。

1.6 Kafka 为什么这么快

这是面试与实战都绕不开的问题。Kafka 的高吞吐来自一组工程决策的叠加:

  1. 顺序写磁盘:消息只追加到日志文件末尾,顺序写磁盘的速度可以接近随机写内存的量级(几百 MB/s 甚至更高),彻底避开随机 IO;
  2. 页缓存(page cache):Kafka 不自己管理缓存,而是充分利用操作系统页缓存。写入先进 page cache,由 OS 异步刷盘;热数据被消费时大概率直接命中缓存,读操作基本不打磁盘;
  3. 零拷贝(zero-copy):消费者拉取消息时,Kafka 使用 sendfile 系统调用,数据从页缓存直接送到网卡,避免在内核态与用户态之间反复拷贝(第 13 章细讲);
  4. 批量与压缩:生产者把多条消息攒成批次发送,一个批次用一种算法压缩(lz4、zstd、snappy 等),网络与存储开销显著降低;
  5. 分区水平扩展:一个主题可以切分成成百上千个分区,分布在不同机器上,读写并行度随机器数线性增长;
  6. 简洁的协议与数据结构:V2 消息格式做了大量字段压缩(变长 varint、增量编码),磁盘占用小,解析快;
  7. 拉模式(pull):消费者按自身能力主动拉取,天然形成背压,不会把慢消费者压垮。

记住这张速记图:

顺序写 + 页缓存 + 零拷贝 + 批量压缩 + 分区并行 + pull 背压
        =  高吞吐、低延迟、可水平扩展

1.7 典型使用场景

日志与埋点采集

成千上万台机器上的应用日志、Nginx 访问日志、用户行为埋点统一汇聚到 Kafka,再流入 ES(检索)、ClickHouse(分析)、HDFS/数据湖(归档)。这是 Kafka 最经典的场景。

消息总线与微服务解耦

服务之间通过事件通信,配合 Outbox、Saga 等模式实现最终一致性(第 26 章展开)。

流式计算

实时大屏、实时风控、实时推荐:Kafka 作为源头,Flink/Spark Streams 做计算,结果再写回 Kafka 或数据库。

CDC 数据同步

用 Debezium 把 MySQL/PostgreSQL 的 binlog/WAL 变更捕获到 Kafka,实现缓存失效、搜索索引更新、数仓同步、异地多活。

数据仓库与数据湖供给

Kafka 作为 ODS 层入口,批量或流式落湖(Iceberg/Hudi/Delta),支撑离线与实时一体的湖仓架构。

1.8 本书的学习地图

入门            实战             原理             运维             架构
01-04 章   ->   05-09 章   ->    10-16 章   ->    17-22 章   ->    23-26 章
跑起来         写代码           懂内部           保稳定           做设计

很多人卡在“会调用 API,但不懂原理”这一层,遇到消息丢失、堆积、再平衡风暴就束手无策。本书的原理篇会把这些“黑盒”一个个拆开,并且每章都给出可以动手验证的实验或命令。

1.9 环境准备

开始第 3 章之前,请准备:

本章小结

思考题

  1. 你的系统里哪些调用链适合改成事件驱动?哪些不适合?
  2. “消费完消息就删除”和“按保留策略删除”这两种设计,分别适合什么业务?
  3. 如果面试官问“Kafka 为什么快”,你能不看书画出 1.6 节那张速记图吗?