主题
02 - RocketMQ 架构与 Kafka 对比
RocketMQ 架构
┌──────────────────────────────────────────────────────────────────┐
│ RocketMQ 架构 │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ NameServer 集群 │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ NameServer 1│ │ NameServer 2│ 轻量级注册中心 │ │
│ │ │ (无状态) │ │ (无状态) │ 每个都是完整的路由信息 │ │
│ │ └──────┬──────┘ └──────┬──────┘ 节点间不通信(简单!) │ │
│ │ └────────┬───────┘ │ │
│ └──────────────────┼─────────────────────────────────────────┘ │
│ │ 注册/心跳/路由 │
│ ┌──────────────────▼─────────────────────────────────────────┐ │
│ │ Broker 集群 │ │
│ │ │ │
│ │ Broker-A (Master) Broker-A (Slave) │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ CommitLog │──▶│ CommitLog (副本) │ │ │
│ │ │ (所有消息顺序写入)│ │ │ │ │
│ │ ├──────────────────┤ └──────────────────┘ │ │
│ │ │ ConsumeQueue │ │ │
│ │ │ (Topic的逻辑队列)│ Broker-B (Master) │ │
│ │ ├──────────────────┤ ┌──────────────────┐ │ │
│ │ │ IndexFile │ │ CommitLog │ │ │
│ │ │ (消息索引) │ │ ConsumeQueue │ │ │
│ │ └──────────────────┘ └──────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼─────────────────────────────────────────┐ │
│ │ Producer 集群 Consumer 集群 │ │
│ │ ┌────────┐ ┌────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Prod 1 │ │ Prod 2 │ │ Cons 1 │ │ Cons 2 │ │ │
│ │ └────────┘ └────────┘ └──────────┘ └──────────┘ │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘RocketMQ 的存储模型
RocketMQ 和 Kafka 存储模型的核心区别:
Kafka: 每个 Partition 一个 log 文件
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Topic-A │ │ Topic-A │ │ Topic-B │
│ Partition-0│ │ Partition-1│ │ Partition-0│
│ ┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │
│ │ .log │ │ │ │ .log │ │ │ │ .log │ │
│ └────────┘ │ │ └────────┘ │ │ └────────┘ │
└────────────┘ └────────────┘ └────────────┘
Topic 多 → 文件多 → 随机 IO ↑
RocketMQ: 所有 Topic 共用一个 CommitLog
┌────────────────────────────────────────────┐
│ CommitLog (唯一) │
│ ┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐ │
│ │A0││B0││A1││A2││B1││C0││A3││B2│ │
│ └──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘ │
│ 所有 Topic 的消息混在一起,顺序追加 │
└─────────────────────┬──────────────────────┘
│ 异步构建
┌─────────────────────▼──────────────────────┐
│ ConsumeQueue (每个 Topic-Queue 一个) │
│ │
│ Topic-A Queue-0: [offset→A0] [offset→A1] │
│ Topic-A Queue-1: [offset→A2] [offset→A3] │
│ Topic-B Queue-0: [offset→B0] [offset→B1] │
│ │
│ ConsumeQueue 是索引,很小 │
│ 真正的消息数据都在 CommitLog 里 │
└────────────────────────────────────────────┘
RocketMQ 的优势:
┌────────────────────────────────────────────────────┐
│ Topic 数量增多时,写入仍然是一个文件的顺序写 │
│ 不像 Kafka 会变成多个文件的随机写 │
│ → RocketMQ 适合 Topic 数量多的场景 │
└────────────────────────────────────────────────────┘RocketMQ 特色功能
┌──────────────────────────────────────────────────────────────┐
│ │
│ 1. 延迟消息 (Delay Message): │
│ 发送消息时指定延迟级别 │
│ 消息在指定时间后才能被消费 │
│ 场景: 订单 30 分钟未支付自动取消 │
│ │
│ Producer → Broker (先放 SCHEDULE_TOPIC) │
│ │ 延迟到期 │
│ ▼ │
│ 投递到真正的 Topic → Consumer │
│ │
│ 2. 事务消息 (Transaction Message): │
│ 半消息 + 本地事务 + 回查 = 最终一致性 │
│ │
│ Producer Broker Consumer │
│ │ │ │ │
│ │──半消息(half)─▶│ │ │
│ │◀──确认────────│ │ │
│ │ │ │ │
│ │ 执行本地事务 │ │ │
│ │ (如: 扣款) │ │ │
│ │ │ │ │
│ │──commit/roll──▶│ │ │
│ │ │──投递消息────▶│ │
│ │ │ │ │
│ 如果commit丢了? │ │ │
│ │◀──回查─────────│ Broker 主动回查 │
│ │──commit───────▶│ Producer 的事务状态 │
│ │
│ 3. 消息轨迹 (Message Trace): │
│ 追踪消息的完整生命周期 │
│ 生产时间 → Broker 存储 → 消费时间 → 消费结果 │
│ │
│ 4. 消息过滤: │
│ Tag 过滤 (简单) 或 SQL 过滤 (复杂) │
│ Consumer 只收自己关心的消息 │
│ │
└──────────────────────────────────────────────────────────────┘Kafka vs RocketMQ 对比
┌──────────────────────────────────────────────────────────────┐
│ Kafka vs RocketMQ 全方位对比 │
├─────────────────┬──────────────────┬─────────────────────────┤
│ │ Kafka │ RocketMQ │
├─────────────────┼──────────────────┼─────────────────────────┤
│ 开发语言 │ Scala/Java │ Java │
│ 开源方 │ LinkedIn → Apache│ 阿里 → Apache │
│ 注册中心 │ ZK / KRaft │ NameServer (轻量) │
│ 存储模型 │ 每分区独立文件 │ CommitLog 统一 │
│ Topic多时性能 │ 下降(随机IO) │ 稳定(顺序IO) │
│ 吞吐量 │ 极高(百万TPS) │ 高(十万TPS) │
│ 延迟消息 │ 不原生支持 │ ✓ 原生支持 │
│ 事务消息 │ 有(较复杂) │ ✓ 原生支持(半消息) │
│ 消息过滤 │ 不支持 │ ✓ Tag/SQL 过滤 │
│ 消息回溯 │ ✓ offset 回溯 │ ✓ 时间戳回溯 │
│ 消息轨迹 │ 不原生 │ ✓ 原生支持 │
│ 死信队列 │ 不原生 │ ✓ 原生支持 │
│ 生态 │ Flink/Spark/连接器│ 阿里云生态 │
├─────────────────┴──────────────────┴─────────────────────────┤
│ │
│ 选型建议: │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 选 Kafka: │ │
│ │ • 大数据场景(日志/事件流 → Flink/Spark) │ │
│ │ • 极致吞吐量 │ │
│ │ • 需要长期存储和回放 │ │
│ │ │ │
│ │ 选 RocketMQ: │ │
│ │ • 业务消息(订单/支付/通知) │ │
│ │ • 需要延迟消息、事务消息 │ │
│ │ • Topic 数量多(>1000) │ │
│ │ • 国内技术生态、阿里云环境 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘模块十完成!