1、Kafka前世今生:消息队列发展史、Kafka诞生背景、Kafka在数据平台中的定位
各位同学好,我是这门课的主讲。今天咱们聊点有意思的——Kafka到底是怎么来的?
说实话,我最早接触消息队列是在2012年。那时候公司还在用ActiveMQ,每天凌晨三点定时任务一跑,队列就崩。后来换了RabbitMQ,好了一些,但一到双十一大促,还是扛不住。直到2015年,我第一次在生产环境引入Kafka,才真正体会到什么叫「为海量数据而生」。
这一章,咱们不急着写代码。先把Kafka的来龙去脉搞清楚。你想想看,一个技术能活十年还越来越火,背后一定有它的道理。
消息队列的演进:从单机到分布式
消息队列这个概念,其实比很多人想象的要老。早在上世纪90年代,IBM的MQSeries就已经在金融行业里跑了。那时候的消息队列,说白了就是两个系统之间的「邮递员」——A系统把消息塞进队列,B系统从队列里取出来处理。
但那个年代的消息队列,有几个硬伤:
- 单点瓶颈——所有消息都经过一台机器,挂了就全完
- 扩展困难——想加一台机器?得改配置、重启、甚至重装
- 吞吐量低——单机每秒几千条就到顶了
后来到了2000年代,开源社区开始发力。ActiveMQ、RabbitMQ、ZeroMQ这些轮番登场。它们解决了「免费」和「易用」的问题,但吞吐量和持久化能力,始终是个坎。
我记得有个项目,用RabbitMQ做日志收集。每天几亿条日志,RabbitMQ直接撑爆了。运维同学半夜被叫起来重启,那叫一个酸爽。
核心痛点总结:
- 传统MQ:功能丰富,但吞吐量天花板明显
- 日志场景:需要高吞吐、持久化、顺序读写
- 分布式需求:必须支持水平扩展、故障自动恢复
Kafka的诞生:LinkedIn的「意外之作」
Kafka的故事,得从LinkedIn说起。2010年左右,LinkedIn的数据团队面临一个头疼的问题:他们需要一套系统,能把网站的各种行为数据(点击、浏览、搜索)实时收集起来,然后喂给多个下游系统。
当时他们试过ActiveMQ,也试过自己写管道。结果都不理想——要么吞吐不够,要么延迟太高,要么数据丢了找不回来。
于是,Jay Kreps、Neha Narkhede和饶军这三个工程师,决定自己造一个轮子。他们参考了日志文件的设计思路——说白了,就是把消息当成日志来写。顺序追加、批量压缩、磁盘顺序读写。这些在数据库领域早就被验证过的技术,被他们用到了消息队列上。
2011年,Kafka正式开源。我记得当时在技术社区看到这个项目,第一反应是:「这玩意儿能行吗?消息队列不用内存用磁盘?」后来一测,发现人家每秒能写几十万条消息,而且数据不会丢。嗯,真香。
Kafka名字的由来: 取自作家弗朗茨·卡夫卡(Franz Kafka)。Jay Kreps说,他喜欢写代码,也喜欢文学,而且「Kafka」这个名字听起来就很「数据流」——其实我觉得,主要是好记。
Kafka的核心设计理念
Kafka为什么能这么猛?我总结了几点:
| 设计理念 | 具体做法 | 带来的好处 |
|---|---|---|
| 磁盘顺序读写 | 消息追加到文件末尾,不随机寻址 | 吞吐量可达百万级/秒 |
| 零拷贝技术 | 数据从磁盘直接到网卡,不走用户态 | 延迟低至毫秒级 |
| 批量压缩 | 多条消息打包发送,减少网络开销 | 带宽利用率提升数倍 |
| 分区与副本 | Topic分成多个Partition,每个Partition有副本 | 水平扩展 + 高可用 |
| 消费者拉模式 | 消费者主动拉取数据,而非推送 | 消费速度可控,防止压垮下游 |
这里我要特别说一下「拉模式」。很多人刚接触Kafka时都会问:为什么不用推模式?推模式不是更实时吗?
我在项目中遇到过这样的场景:用推模式的消息队列,生产者一秒钟发一万条,消费者处理不过来,消息积压,最后内存爆了。换成Kafka的拉模式之后,消费者根据自己的处理能力来拉数据,慢就少拉,快就多拉。系统反而更稳定了。
避坑指南: 我曾经以为Kafka的「高性能」意味着可以无脑用。后来发现,如果Partition数量设置不合理(比如太多或太少),性能会大打折扣。具体怎么设,咱们后面会专门讲。
Kafka在数据平台中的定位
现在很多公司都在搞「数据中台」或者「数据平台」。Kafka在这个体系里,到底扮演什么角色?
我画了一张图,帮你快速理解:
从这张图你能看到,Kafka处于数据平台的「中枢」位置。上面接着各种数据源,下面连着各种消费系统。它不负责存储海量历史数据,也不负责计算,它只做一件事——高效、可靠地把数据从A搬到B、C、D。
我个人习惯把Kafka比作「数据高速公路」。你想想看,如果没有这条高速路,每个数据源都要跟每个消费系统单独建连接,那得多乱?有了Kafka,所有数据都往这条路上汇,谁需要谁自己来取。这就是解耦。
Kafka vs 其他消息队列
很多同学会问:Kafka跟RabbitMQ、RocketMQ到底怎么选?我直接给你一张对比表:
| 特性 | Kafka | RabbitMQ | RocketMQ |
|---|---|---|---|
| 设计定位 | 分布式流平台 | 传统消息中间件 | 分布式消息中间件 |
| 吞吐量 | 百万级/秒 | 万级/秒 | 十万级/秒 |
| 消息可靠性 | 高(副本机制) | 高(确认机制) | 高(同步刷盘) |
| 消息顺序 | 分区内有序 | 队列内有序 | 队列内有序 |
| 消息回溯 | 支持(基于offset) | 不支持 | 支持有限 |
| 典型场景 | 日志收集、流计算、数据管道 | 任务队列、RPC调用 | 交易消息、订单系统 |
说白了,如果你的场景是「海量数据、高吞吐、需要回溯」,选Kafka准没错。如果是「小规模、低延迟、需要复杂路由」,RabbitMQ更合适。RocketMQ则介于两者之间,在金融场景用得比较多。
我的建议: 做数据平台,Kafka几乎是标配。因为它不仅能处理实时数据,还能把数据持久化下来,供后续的离线分析使用。一套系统,搞定实时+离线,性价比很高。
本章小结
这一章咱们聊了:
- 消息队列从单机到分布式的发展历程
- Kafka在LinkedIn诞生的背景和设计理念
- Kafka在数据平台中的核心定位——数据中枢
- Kafka与其他消息队列的对比