Skip to content

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)                            │    │
│  │  • 国内技术生态、阿里云环境                          │    │
│  └──────────────────────────────────────────────────────┘    │
│                                                              │
└──────────────────────────────────────────────────────────────┘

模块十完成!