Kafka
一、Kafka 是什么?
Kafka 是一个分布式、高吞吐的消息系统,最早由 LinkedIn 开源,后来成为 Apache 顶级项目。它最初的定位是"日 志收集系统",但随着生态的发展,Kafka 已经成为现代企业中最重要的消息中间件之一,被广泛用于 异步解耦、削峰 填谷、日志采集、实时计算、数据管道(Data Pipeline) 等场景。
Kafka 的核心思想是:将数据以"事件流"的形式写入 Topic,并通过分区机制实现高并发写入与消费,从而支持大规模 数据流处理。
二、Kafka 的核心概念
Kafka 的基本结构由以下几个部分组成:
-
Broker:Kafka 服务节点,一个 Kafka 集群通常包含多个 Broker。
-
Topic:消息主题,相当于一个逻辑分类。
-
Partition:Topic 的分区,用于提高并发和吞吐量。
-
Producer:消息生产者,负责写入消息。
-
Consumer:消息消费者,负责读取消息。
-
Consumer Group:消费者组,组内多个消费者共同消费一个 Topic 的不同分区,实现并行消费。
-
Offset:消息在分区中的序号,用于标识消费位置。
-
Kafka 的消息存储是基于磁盘顺序写入(append log),并通过零拷贝技术等手段保证性能。
三、Kafka 的主要特性
1. 高吞吐量
Kafka 的设计目标就是高吞吐,通过分区 + 顺序写磁盘的方式,单机就能达到非常高的写入性能,集群扩展后吞吐更 强。
2. 分布式扩展能力强
Kafka 可以通过增加 Broker 节点横向扩容,Topic 分区也可以扩展,使得集群能够承载更大的数据量。
3. 持久化存储
Kafka 默认将消息落盘保存,消息不会因为 Broker 重启而丢失,适合日志、事件流、业务数据同步等场景。
4. 消费模型灵活
Kafka 支持:
发布订阅模式(多个组订阅同一 Topic)
消费者组模式(同组内分摊分区,实现并行消费)
5. 支持流式处理生态
Kafka 不仅是消息队列,它更像一个数据流平台:
-
Kafka Connect:数据同步组件
-
Kafka Streams:流处理框架
-
与 Flink / Spark Streaming 集成方便
6. KRaft 模式(Kafka 4.x 的重要变化)
Kafka 早期依赖 Zookeeper 管理元数据(集群节点、Topic信息等)。 Kafka 3.x 开始支持 KRaft(Kafka Raft)模式,Kafka 4.x 更推荐使用 KRaft,从而实现:
-
不依赖 Zookeeper
-
部署更简单
-
运维复杂度降低
四、Kafka 的典型应用场景
Kafka 最常见的使用场景包括:
-
系统解耦:订单系统写 Kafka,库存系统订阅处理。
-
削峰填谷:高并发请求先写 Kafka,后端慢慢消费处理。
-
日志采集:服务日志统一写 Kafka,再进入 ELK 或大数据平台。
-
实时计算:Kafka + Flink 实时统计用户行为。
-
数据同步:数据库 binlog 写 Kafka,再同步到 ES、Redis、数仓。
五、Kafka 4.2.0 Windows 单机启动命令
(KRaft,无需 Zookeeper)
以下为 Windows 下 Kafka 4.2.0(kafka2.13-4.2.0)单机启动步骤。
假设 Kafka 解压目录为:
E:\kafka_2.13-4.2.0
1. 进入 Kafka 根目录
cd /d E:\kafka_2.13-4.2.0
2. 生成 cluster-id(只执行一次)
cmd
bin\windows\kafka-storage.bat random-uuid
输出示例:
vBC75SBHTyiu62KueirjYA
3. 初始化存储(format,只执行一次)
cmd
bin\windows\kafka-storage.bat format --standalone -t vBC75SBHTyiu62KueirjYA -c config\server.properties
注意:format 只需要执行一次,执行过后不要重复执行,否则可能导致数据目录重新初始化。
4. 启动 Kafka(每次启动执行)
cmd
bin\windows\kafka-server-start.bat config\server.properties
Kafka 启动后窗口不要关闭。
5. 创建 Topic(可选)
新开 CMD 窗口执行:
cmd
cd /d E:\kafka_2.13-4.2.0 bin\windows\kafka-topics.bat --create --topic test-topic --bootstrap-server localhost:9092 - -partitions 1 --replication-factor 1
6. 生产者发送消息(可选)
cmd
bin\windows\kafka-console-producer.bat --topic test-topic --bootstrap-server localhost:9092
7. 消费者消费消息(可选)
cmd
bin\windows\kafka-console-consumer.bat --topic test-topic --from-beginning --bootstrap- server localhost:9092
8. 关闭 Kafka
在 Kafka 运行窗口按:
Ctrl + C
六、Kafka 与 RocketMQ、RabbitMQ 的对比分析
在企业中常见的消息队列主要有 Kafka、RocketMQ、RabbitMQ。它们各自定位不同,适用场景也不同。
1. Kafka vs RocketMQ
Kafka 优势
-
吞吐量非常高(适合大数据场景)
-
分区机制强大,适合日志和事件流
-
与大数据生态结合紧密(Flink、Spark、Hadoop)
-
天然支持流式处理
Kafka 劣势
-
消息顺序只能保证"分区内顺序"
-
事务消息、延迟消息等能力需要额外实现或组件支持
-
对业务消息场景来说配置和运维略复杂
RocketMQ 优势
-
更适合业务场景(订单、支付、交易)
-
支持 延迟消息、事务消息、顺序消息
-
消费失败重试机制成熟
-
在国内互联网企业中应用广泛(阿里系)
RocketMQ 劣势
-
生态和流式处理能力不如 Kafka 强
-
在日志采集、海量数据吞吐场景略弱于 Kafka
2. Kafka vs RabbitMQ
Kafka 优势
-
吞吐远高于 RabbitMQ
-
分区扩展能力更强
-
更适合日志/流式数据/实时计算
Kafka 劣势
-
低延迟不如 RabbitMQ(RabbitMQ 在微秒级别更优秀)
-
Kafka 消息模型更偏"日志流",不如 RabbitMQ 的路由灵活
RabbitMQ 优势
-
基于 AMQP 协议,路由能力非常强
-
支持多种交换机模式(Direct、Topic、Fanout)
-
消息可靠性、确认机制成熟
-
适合中小型业务系统的异步通信
RabbitMQ 劣势
-
吞吐量比 Kafka 和 RocketMQ 小
-
集群扩展复杂,性能在大规模场景下容易成为瓶颈
-
不适合大数据日志、流处理场景
七、三者总结对比表
| 对比维度 | Kafka | RocketMQ | RabbitMQ |
|---|---|---|---|
| 定位 | 流式数据平台、日志系统 | 业务消息队列 | 企业级消息中间件(AMQP) |
| 吞吐量 | 极高(百万级) | 高(十万级) | 中等(万级) |
| 延迟 | 中等(毫秒级) | 中等偏低(毫秒级) | 低(微秒级) |
| 顺序消息 | 支持(分区内顺序) | 支持(单Queue内严格顺序) | 支持(但吞吐受影响) |
| 事务消息 | 支持(但较复杂) | 原生支持(金融级) | 支持(但不如RocketMQ完善) |
| 延迟消息 | 不支持(需额外实现) | 原生支持 | 支持(通过插件或TTL实现) |
| 消费模式 | Pull 为主 | Push / Pull | Push 为主 |
| 生态整合 | Flink/Spark/大数据生态强 | Java业务生态强 | 微服务集成强 |
| 典型场景 | 日志、埋点、实时计算 | 订单、支付、交易业务 | 系统解耦、任务异步 |
八、如何选择 Kafka / RocketMQ / RabbitMQ?
选择 Kafka 的场景
-
大规模日志采集
-
用户行为埋点
-
数据同步管道
-
实时计算(Flink / Spark Streaming)
-
对吞吐量要求极高
选择 RocketMQ 的场景
-
订单、交易、支付等核心业务
-
需要延迟消息、事务消息
-
需要严格的消息可靠投递和重试机制
选择 RabbitMQ 的场景
-
微服务之间的异步调用
-
对消息路由要求复杂(多种交换机规则)
-
系统规模中小,追求低延迟和稳定性
九、总结
Kafka 是一个以"事件流"为核心的数据平台型消息系统,强调高吞吐、可扩展、持久化与流式生态整合。在 Kafka 4.x 中,KRaft 模式进一步降低了部署复杂度,使 Kafka 更适合现代企业快速搭建高性能消息系统。
RocketMQ 更偏业务消息领域,功能更贴近企业交易系统需求;RabbitMQ 则以灵活路由、低延迟和 AMQP 协议标准 化为优势,适合中小规模系统的异步通信。
如果你的系统偏实时数据、日志、数据平台,Kafka 是首选;如果偏交易业务和复杂消息能力,RocketMQ 更合适; 如果偏传统企业消息路由与轻量异步,RabbitMQ 更适合。