RocketMQNotes

第 26 章:Kafka 对比

zjc 于 2026-01-26 发布

这是《RocketMQ 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Kafka 和 RocketMQ 都是高吞吐分布式消息系统,但默认设计取向不同。Kafka 早期围绕流式日志和批量传输发展,RocketMQ 更强调业务消息能力,例如事务消息、重试队列、延迟消息和丰富的队列治理。选型要结合业务语义、团队经验和运维能力。

26.1 定位差异

维度 Kafka 常见定位 RocketMQ 常见定位
核心场景 流处理日志管道、事件流 业务事件、交易事件、任务消息
消费模型 拉取分区日志 拉取队列,Push 封装
典型生态 Kafka Connect、Streams、Flink 业务解耦、事务、延迟、重试
数据形态 高吞吐追加日志 业务消息和索引查询

这不是绝对边界。Kafka 可以承载业务事件,RocketMQ 也能承载流处理,但生态和默认优化会使成本不同。

26.2 存储模型

Kafka 常见模型:

partition log
  segment files
  consumer offset

RocketMQ 模型:

CommitLog
  all topics appended together
ConsumeQueue
  logical queue index
IndexFile
  key/time query index

对比:

项目 Kafka RocketMQ
写入组织 每个 partition 追加 Broker 内所有 Topic 汇入 CommitLog
队列数量多时 文件和 IO 更分散 顺序写更集中
按消息 Key 查询 不是核心能力 IndexFile 原生支持
存储层复杂度 partition 模型直观 多层索引需要理解

不同版本和云实现都有优化,以上是通用架构差异,不代表所有部署形态。

26.3 消息语义

能力 Kafka RocketMQ
至少一次 支持 支持
消费重试 应用或生态处理 消费组重试队列
死信 依赖生态或自建 系统死信 Topic
延迟消息 通常应用或生态实现 4.x 固定级别,5.x 增强定时能力
事务消息 Kafka 事务面向流处理原子写读 RocketMQ 面向本地事务与消息提交
消息轨迹 生态实现 客户端和平台能力

两者的事务语义目标不同,不能简单说谁更强。Kafka 事务偏流处理多条记录的原子性,RocketMQ 事务消息偏业务库与消息发送的一致性。

26.4 消费与位点

Kafka:

  1. 消费者组管理 partition 分配;
  2. offset 可提交到内部 Topic;
  3. rebalance 生态成熟;
  4. 常配合 Streams 或 Flink 管理状态。

RocketMQ:

  1. 消费者组管理 queue 分配;
  2. 位点保存在 Broker;
  3. 提供重试和死信模型;
  4. Push 客户端封装长轮询;
  5. 队列数决定最大并行度。

两者都有重复可能,业务都必须幂等。

26.5 性能与延迟

影响性能的因素:

  1. 消息大小;
  2. 批量大小;
  3. 刷盘策略;
  4. 副本同步;
  5. 分区 / 队列数;
  6. 客户端语言;
  7. 消费逻辑;
  8. 磁盘和网络;
  9. 是否冷读;
  10. 是否开启轨迹和复杂过滤。

粗略结论:

场景 常见倾向
大吞吐流日志 Kafka 常有优势
大量 Topic 队列写入 RocketMQ CommitLog 聚合写入有优势
低延迟小包业务消息 需实测
按业务 Key 查消息 RocketMQ 更直接

不要根据网上单点压测做最终决策,必须用自己的消息大小、副本、延迟目标和磁盘模型压测。

26.6 运维对比

维度 Kafka RocketMQ
元数据 KRaft 或历史 ZooKeeper NameServer / Controller 演进
分区迁移 常用重分配工具 队列与 Broker 治理
多租户 配额、ACL、生态治理 ACL、Topic 配额、平台治理
云托管 成熟 逐渐增强
排障生态 非常丰富 国内实践和社区资料较多

团队熟悉度经常比架构差异更影响总成本。

26.7 选型建议

优先考虑 RocketMQ:

  1. 业务事件需要事务消息、延迟消息、重试死信;
  2. Topic 和队列数量多;
  3. 常按消息 Key 查询轨迹;
  4. 团队已有 RocketMQ 运维经验;
  5. 需要 Java 客户端深度集成。

优先考虑 Kafka:

  1. 大规模流式日志管道;
  2. 以 Flink / Kafka Streams 为核心的数据平台;
  3. 生态连接器要求高;
  4. 主要做 append-only 事件流和回放;
  5. 团队已有 Kafka 平台能力。

26.8 混合架构

常见分层:

business service
  -> RocketMQ business events
  -> data integration
  -> Kafka stream platform

边界:

  1. 业务动作与事务一致性放 RocketMQ;
  2. 分析、实时计算、日志汇聚放 Kafka;
  3. 两边通过 CDC 或事件桥接;
  4. 统一事件 ID 和 schema 治理;
  5. 避免双写核心状态。

本章小结

Kafka 和 RocketMQ 的差异来自设计目标:流日志管道与业务消息治理。RocketMQ 的优势在业务消息功能完整、队列治理和消息轨迹;Kafka 的优势在流生态、连接器和高吞吐管道。选型应以业务语义、团队能力和压测结果为准,而不是纸面参数。

思考题

  1. 为什么不能简单比较两者 TPS?
  2. RocketMQ CommitLog 聚合写入带来什么收益?
  3. 两者事务语义有什么不同目标?
  4. 什么场景适合 RocketMQ 与 Kafka 混用?
  5. 选型时团队经验为什么重要?