1. Kafka 入门:消息队列概念、发展史、核心优势与应用场景

大家好,我是你们这门课的老朋友。今天咱们正式开篇,聊聊 Kafka 到底是个什么东西。

说实话,我第一次接触 Kafka 是在 2016 年。那时候公司日志系统扛不住了,每天几 TB 的数据,传统的消息队列直接崩。后来架构师说试试 Kafka,我一开始还不太信——一个消息队列能有多能扛?结果一测,吞吐量直接拉满,CPU 占用还低。嗯,从那以后我就成了 Kafka 的忠实用户。

1.1 消息队列:你每天都在用,只是没意识到

先说说消息队列。说白了,它就是个“中间人”。

你想想看,两个系统之间要传数据,最粗暴的方式就是 A 直接调用 B 的接口。但问题来了——B 挂了怎么办?A 发太快 B 处理不过来怎么办?这时候消息队列就派上用场了。

消息队列的核心就三件事:

  • 解耦:生产者只管发消息,消费者只管收消息,两边互不依赖。
  • 削峰填谷:流量洪峰来了,消息先存队列里,消费者慢慢处理。
  • 异步处理:不用等对方处理完,发完消息就干别的事。

我在项目中遇到过最典型的场景:用户注册后要发邮件、发短信、更新推荐系统。如果同步做,注册接口响应时间直接飙到 3 秒以上。用消息队列异步处理,200 毫秒就返回了,用户体验好得多。

一个小建议:消息队列不是银弹。如果两个系统之间需要实时响应,或者数据一致性要求极高(比如转账),那还是老老实实用 RPC 吧。

1.2 Kafka 发展史:从 LinkedIn 内部工具到行业标准

Kafka 的故事挺有意思的。2010 年,LinkedIn 的几个工程师——Jay Kreps、Neha Narkhede 和饶军——发现公司内部的数据管道太乱了。每个系统都有自己的数据收集方式,日志、指标、用户行为数据散得到处都是。

他们想要一个统一的数据收集平台,能扛住海量数据,还要支持实时和离线两种场景。于是 Kafka 诞生了。2011 年开源,2012 年进入 Apache 孵化器,后来成了 Apache 顶级项目。

我记得 2014 年 Kafka 0.8 版本发布时,引入了复制机制,这才真正适合生产环境。那时候我还在用 RabbitMQ,看到 Kafka 的吞吐量数据后,果断开始研究它。

几个关键里程碑:

时间 版本 核心变化
2010 内部版本 LinkedIn 内部使用,解决数据管道问题
2011 0.7 开源,发布到 GitHub
2012 0.8 引入复制机制,支持数据持久化
2014 0.8.2 正式进入 Apache 孵化器
2016 0.10 引入 Kafka Streams,支持流处理
2017 1.0 第一个正式大版本,生态成熟
2021 2.8 支持 Raft 协议,逐步去除 ZooKeeper 依赖
2023 3.5 KRaft 模式生产就绪,架构更简洁

核心观点:Kafka 从诞生起就定位为“分布式流平台”,而不是简单的消息队列。这个定位让它跟 RabbitMQ、ActiveMQ 有了本质区别。

1.3 Kafka 核心优势:为什么它能成为行业标准?

这些年我用过不少消息中间件,RabbitMQ、RocketMQ、Pulsar 都碰过。但 Kafka 有几个优势,让我一直离不开它。

1.3.1 高吞吐量

这是 Kafka 最硬核的能力。单机就能扛住每秒几十万条消息,甚至百万级。为什么能做到?

  • 顺序读写磁盘:Kafka 充分利用磁盘的顺序读写能力,比随机读写快几个数量级。我做过测试,顺序写磁盘的速度跟写内存差不了太多。
  • 零拷贝技术:消息从磁盘到网络,不走用户态,直接在内核态完成,省掉了数据拷贝的开销。
  • 批量处理:消息攒一批再发送,减少网络往返次数。

1.3.2 持久化与可靠性

Kafka 的消息默认就存在磁盘上,不会因为消费者没消费就丢失。而且支持多副本机制,一台机器挂了,其他副本顶上。

我曾经在生产环境遇到过磁盘损坏的情况。因为配置了 3 个副本,数据一点没丢,换个磁盘重新同步就恢复了。要是用内存型消息队列,那损失就大了。

1.3.3 分布式与水平扩展

Kafka 天生就是分布式的。集群可以扩展到上百台机器,数据自动分片到不同节点。扩容时只需要加机器,不需要停服务。

1.3.4 消息回溯与重放

这是 Kafka 跟其他消息队列最大的区别。消息消费后不会立即删除,而是保留一段时间(可配置)。你可以从头开始重新消费,这在数据修复、离线分析场景下太有用了。

避坑指南:我曾经因为没注意消息保留时间,导致离线任务跑的时候数据已经被删了。后来我养成了习惯——关键数据保留至少 7 天,日志类数据保留 3 天,根据业务需求灵活配置。

1.4 应用场景分析:Kafka 到底能干什么?

Kafka 的应用场景比你想的要多。我列几个最常见的:

1.4.1 日志收集与监控

这是 Kafka 最经典的应用。公司所有服务的日志统一发送到 Kafka,然后由 Logstash、Fluentd 等工具消费,写入 Elasticsearch 做全文检索,或者写入 Hadoop 做离线分析。

我之前负责过一个日活千万级别的平台,每天日志量超过 10TB。用 Kafka 做缓冲层,后端无论怎么扩容缩容,日志收集系统都稳如泰山。

1.4.2 消息驱动任务调度

这也是咱们这门课的核心主题。用 Kafka 作为任务队列,生产者发布任务消息,消费者拉取并执行。相比传统的定时任务调度,Kafka 方案更灵活:

  • 支持任务优先级
  • 支持任务重试与死信处理
  • 支持任务状态追踪
  • 天然支持分布式执行

1.4.3 流式处理

Kafka Streams 和 ksqlDB 让 Kafka 具备了流处理能力。你可以直接在 Kafka 上做实时计算,比如实时统计、实时推荐、实时风控。

1.4.4 事件溯源与 CQRS

在微服务架构中,Kafka 常被用来实现事件溯源。所有状态变更都作为事件写入 Kafka,其他服务订阅这些事件来更新自己的视图。这种模式在金融、电商领域用得很多。

1.4.5 系统解耦与异步通信

微服务之间的异步调用、数据同步,都可以用 Kafka 来做。比如订单服务下单后,通知库存服务扣库存、通知物流服务发货、通知用户服务发通知。

下面这张图展示了 Kafka 在典型数据管道中的位置:

Kafka 在数据管道中的核心位置 应用服务 数据库 CDC IoT 设备 前端埋点 Kafka 集群 高吞吐 · 持久化 多副本 · 水平扩展 消息回溯 · 流处理 实时计算 离线数仓 监控告警 搜索索引 Kafka 作为数据中枢,连接生产者和消费者,实现解耦、缓冲和流式处理

1.5 与其他消息队列的对比

很多同学会问:Kafka 跟 RabbitMQ、RocketMQ 到底怎么选?我根据自己的经验整理了一个对比表:

特性 Kafka RabbitMQ RocketMQ
吞吐量 极高(百万级/秒) 中等(万级/秒) 高(十万级/秒)
消息模型 发布-订阅 + 消费组 队列 + 交换机 发布-订阅 + 消费组
消息顺序 分区内严格有序 单队列有序 分区内严格有序
消息回溯 支持(基于 offset) 不支持 支持(有限度)
延迟 毫秒级 微秒级 毫秒级
适用场景 大数据、日志、流处理 业务消息、任务队列 金融、电商、事务消息
我的选择建议:如果追求极致吞吐量、需要消息回溯、做流式处理,选 Kafka。如果对延迟极其敏感、消息量不大但路由规则复杂,RabbitMQ 更合适。如果既要高吞吐又要事务消息,RocketMQ 值得考虑。

1.6 本章小结

好了,第一章的内容就到这里。咱们回顾一下:

  • 消息队列的核心价值是解耦、削峰、异步
  • Kafka 从 LinkedIn 内部工具成长为行业标准,经历了十多年的演进
  • Kafka 的核心优势是高吞吐、持久化、分布式、消息回溯
  • 应用场景覆盖日志收集、任务调度、流处理、事件溯源等