1、Kafka简介:什么是Kafka、Kafka发展历史、Kafka核心特性、Kafka应用场景

大家好,欢迎来到这门课。我是你们的老朋友,一个在数据管道里摸爬滚打了好几年的工程师。

咱们第一节课,先聊聊Kafka到底是什么。说白了,Kafka就是一个分布式消息流平台。你想想看,在微服务架构里,服务A要给服务B发个消息,最笨的办法是直接HTTP调用。但要是服务B挂了怎么办?要是流量突然暴增怎么办?这时候,中间加一个Kafka,所有消息先往Kafka里塞,谁需要谁自己去取。这就好比一个快递,而不是点对点送货。

核心定义:Kafka是一个分布式、分区、多副本的基于ZooKeeper协调的分布式消息系统。它的定位是「高吞吐量的分布式发布订阅消息系统」。

1.1 发展历史:从LinkedIn内部工具到Apache顶级项目

Kafka的故事,得从2010年说起。我记得当时LinkedIn(领英)面临一个头疼的问题:他们需要收集大量用户行为数据(点击、浏览、搜索),然后实时分析。但现有的消息队列,比如ActiveMQ、RabbitMQ,吞吐量根本扛不住。

于是,LinkedIn的工程师Jay Kreps、Neha Narkhede和饶军(Jun Rao)决定自己写一个。他们最初的目标很简单:每天能处理数千亿条消息。2011年,Kafka正式开源,2012年成为Apache顶级项目。

我刚开始接触Kafka是2015年,那时候版本还是0.8.x。说实话,配置起来挺麻烦的,ZooKeeper还得单独部署。但它的性能确实惊艳——单机就能扛住每秒几十万条消息。后来Confluent公司成立,Kafka生态越来越完善,现在已经是数据架构的标配了。

时间 里程碑 我的感受
2010年 LinkedIn内部开发 解决海量日志收集问题
2011年 正式开源 消息系统领域的新星
2012年 成为Apache顶级项目 社区开始活跃
2014年 Kafka 0.8.0 发布 我入坑的版本,复制功能上线
2016年 Kafka Streams 发布 流处理能力,不再只是消息队列
2020年+ Kafka 3.x 移除ZooKeeper依赖 KRaft模式,部署更简单

1.2 核心特性:为什么大家都选Kafka?

Kafka能火,不是没有原因的。我总结了几点最核心的特性,也是我在项目中反复验证过的。

1.2.1 高吞吐量

这是Kafka的看家本领。它采用顺序读写磁盘和零拷贝技术,单机吞吐量可以达到每秒几十万甚至上百万条消息。相比之下,传统的消息队列(比如RabbitMQ)单机也就几万条。为什么会这样?因为Kafka把消息写到磁盘时,是追加到文件末尾,而不是随机写入。机械硬盘的顺序读写速度,其实不比内存差多少。

避坑指南:我曾经遇到一个项目,业务方说「Kafka怎么这么慢?」。后来一查,他们把消息体搞到了10MB一条。Kafka虽然吞吐高,但消息体太大一样会拖垮性能。我建议单条消息控制在1MB以内,最好100KB左右。

1.2.2 持久化与可靠性

Kafka的消息默认是持久化到磁盘的,而且支持多副本机制。你可以配置副本数(比如3个),即使某台机器宕机,其他副本还能提供服务。数据不会丢,这是生产环境的基本要求。

1.2.3 分布式与可扩展

Kafka是天生分布式的。你可以通过增加Broker节点来水平扩展集群。我见过最大的集群有几百台机器,每天处理万亿条消息。扩展的时候,只需要把新机器加进去,然后重新分配分区就行,业务代码不用改。

1.2.4 消息回溯与重放

这是Kafka和很多消息队列不一样的地方。Kafka的消息消费后不会立即删除,而是根据配置的保留策略(比如保留7天)来清理。这意味着你可以从头开始重新消费历史数据。我在做数据修复时,这个功能救过我好几次。

1.2.5 流处理能力

Kafka Streams和KSQL让Kafka不再只是一个消息管道,而是一个流处理平台。你可以直接在Kafka上做实时计算,比如窗口聚合、状态管理,不需要额外部署Storm或Flink。

特性 Kafka 传统消息队列(如RabbitMQ)
吞吐量 百万级/秒 万级/秒
消息存储 磁盘持久化,可回溯 内存为主,消费即删除
消费模式 拉模式(Pull) 推模式(Push)
顺序保证 分区内严格有序 全局有序(性能差)
扩展性 水平扩展,无状态 集群扩展复杂

1.3 应用场景:Kafka能做什么?

Kafka的应用场景非常广。我挑几个最常见的,结合我自己的经历聊聊。

1.3.1 日志收集与分析

这是Kafka最经典的应用。我记得在2016年,我给一家电商公司搭日志系统。所有服务器的访问日志、业务日志,通过Filebeat采集到Kafka,然后Logstash消费写入Elasticsearch。Kafka在这里起到了削峰填谷的作用——白天流量高峰时,日志量暴增,Kafka先扛住,晚上再慢慢消费写入ES。如果没有Kafka,ES早就被写爆了。

1.3.2 消息系统

解耦微服务。比如订单服务下单后,发一条消息到Kafka,库存服务、积分服务、通知服务各自去消费。这样即使库存服务挂了,订单服务也不受影响。消息在Kafka里等着,库存服务恢复后继续消费。

1.3.3 用户活动跟踪

网站或App的用户行为数据(点击、浏览、搜索、购买),都可以通过Kafka实时收集。然后用于实时推荐、用户画像、AB测试等。我做过一个项目,每天处理10亿条用户点击流,Kafka稳如老狗。

1.3.4 流处理

用Kafka Streams做实时ETL、实时监控告警。比如检测到某个接口的失败率超过阈值,立刻触发告警。或者实时计算网站的UV(独立访客数),每5分钟更新一次。

1.3.5 事件溯源

把Kafka当作事件存储。每个状态变更都作为一个事件追加到Kafka。这样你可以回溯任意时间点的系统状态。这在金融、审计场景中非常有用。

注意:Kafka不是万能的。它不适合做「小消息、低延迟」的场景。比如你只是偶尔发几条消息,延迟要求毫秒级,那RabbitMQ可能更合适。Kafka的设计目标是高吞吐,启动和连接开销相对较大。

1.4 Kafka核心架构图

下面这张图,是我自己画的Kafka核心架构。你看一遍,基本就能理解Kafka是怎么工作的了。

Kafka 核心架构图 Producer Producer Producer Kafka Cluster Broker 1 Topic-A P0 Broker 2 Topic-A P1 Broker 3 Topic-A P2 Broker 4 Topic-B P0 ZooKeeper (协调服务) Consumer Consumer 架构说明: 1. Producer 将消息发送到 Topic 的某个 Partition(分区) 2. Partition 分布在多个 Broker 上,每个 Partition 有 Leader 和 Follower 副本 3. Consumer 从 Partition 拉取消息,每个 Consumer 属于一个 Consumer Group 4. ZooKeeper 负责 Broker 注册、Leader 选举、元数据管理(Kafka 3.x 后可选 KRaft)

嗯,这张图基本把Kafka的核心组件都串起来了。Producer只管往Topic里写,Consumer只管从Topic里读,Broker负责存。ZooKeeper(或者新版的KRaft)负责协调。就是这么简单。

1.5 小结

这一章我们聊了Kafka是什么、怎么来的、有什么本事、能干什么。我个人觉得,Kafka最厉害的地方不是某一个特性,而是它把高吞吐、持久化、分布式、流处理这些能力整合在了一起。你不需要再拼凑多个系统,一个Kafka就能搞定大部分数据管道需求。