核心概念
理解 RocketMQ 的核心概念是使用好运消息中间件的基础。本章将详细介绍 RocketMQ 的各个核心组件和概念。
架构概览
RocketMQ 采用分布式集群架构,主要由以下四个核心组件构成:
核心组件
NameServer(名字服务器)
NameServer 是 RocketMQ 的路由注册中心,类似于注册中心,负责管理整个集群的路由信息。
核心职责:
- 路由注册:接收 Broker 的注册信息,维护 Topic 与 Broker 的映射关系
- 路由发现:为 Producer 和 Consumer 提供路由信息,帮助它们找到对应的 Broker
- 路由剔除:检测 Broker 的存活状态,自动剔除不可用的 Broker
特点:
- 无状态设计,各 NameServer 节点之间不通信
- 轻量级,性能极高
- 支持多节点部署,任意节点宕机不影响服务
为什么不使用 ZooKeeper?
RocketMQ 早期版本使用 ZooKeeper,后来改为自研 NameServer,原因如下:
- 简化架构:NameServer 功能单一,无需复杂的选主逻辑
- 性能更高:NameServer 内存存储,响应速度更快
- 运维简单:无需额外维护 ZooKeeper 集群
Broker(消息代理)
Broker 是 RocketMQ 的核心组件,负责消息的存储、索引和转发。
核心职责:
- 消息存储:接收生产者发送的消息,持久化存储
- 消息投递:根据消费请求将消息投递给消费者
- 消息索引:构建消息索引,支持按 Key 查询消息
- 主从同步:支持主从架构,保证数据高可用
Broker 架构:
重要配置参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
brokerName | Broker 名称 | 机器主机名 |
brokerId | Broker ID(0 表示 Master) | 0 |
listenPort | Broker 监听端口 | 10911 |
storePathRootDir | 存储根目录 | 用户主目录 |
flushDiskType | 刷盘方式 | ASYNC_FLUSH |
Broker 高可用:
Producer(生产者)
生产者是消息的发送者,负责将业务消息发送到 Broker。
核心职责:
- 消息构建:封装业务数据为消息对象
- 消息发送:将消息发送到指定的 Topic
- 发送结果处理:处理发送成功或失败的回调
生产者组:
- 同一类 Producer 的集合
- 发送同一类消息,发送逻辑一致
- 用于事务消息的回查
Consumer(消费者)
消费者是消息的接收和处理者,从 Broker 拉取消息进行业务处理。
核心职责:
- 消息订阅:订阅感兴趣的 Topic 和 Tag
- 消息拉取:从 Broker 获取消息
- 消息处理:执行业务逻辑处理消息
- 消费确认:向 Broker 提交消费结果
消费者组:
- 同一类 Consumer 的集合
- 消费同一类消息,消费逻辑一致
- 组内消费者共同分担消息消费(负载均衡)
- 不同消费者组可以独立消费同一 Topic
消息模型
Topic(主题)
Topic 是消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息。
特点:
- 通过 TopicName 唯一标识
- 一个 Topic 可以分布在多个 Broker 上
- 每个 Topic 默认包含多个 MessageQueue
Topic 与消息类型:
RocketMQ 5.0 开始支持消息类型强制校验,每个 Topic 只允许发送一种类型的消息:
| 消息类型 | 说明 |
|---|---|
| NORMAL | 普通消息 |
| FIFO | 顺序消息 |
| TRANSACTION | 事务消息 |
| DELAY | 延时消息 |
MessageQueue(消息队列)
MessageQueue 是消息存储和传输的实际容器,也是消息的最小存储单元。
特点:
- 每个 Topic 由多个 Queue 组成
- Queue 是消息的实际存储单位
- Queue 分布在不同 Broker 上实现水平扩展
队列的作用:
- 水平扩展:通过增加队列数量提高并发能力
- 负载均衡:消费者组内各消费者分担不同队列的消费
- 顺序保证:同一队列内的消息严格按顺序存储
// Topic 与 Queue 的关系
Topic: OrderTopic
├── Queue 0 (Broker-A) // 消息按顺序存储
│ ├── Message 1
│ ├── Message 2
│ └── Message 3
├── Queue 1 (Broker-A)
│ ├── Message 4
│ └── Message 5
├── Queue 2 (Broker-B)
│ └── Message 6
└── Queue 3 (Broker-B)
└── Message 7
Message(消息)
消息是 RocketMQ 中最小的数据传输单元。
消息结构:
Message {
String topic; // 主题(必填)
String tags; // 标签(可选,用于过滤)
String keys; // 消息索引键(可选,用于查询)
int flag; // 标志位
Map<String, String> properties; // 扩展属性
byte[] body; // 消息体(必填)
}
消息属性详解:
| 属性 | 说明 | 使用场景 |
|---|---|---|
| Topic | 消息主题 | 标识消息类别 |
| Tag | 消息标签 | 细粒度消息分类 |
| Keys | 消息索引键 | 查询消息 |
| Body | 消息体 | 业务数据 |
| DelayTimeLevel | 延时级别 | 延时消息 |
| TransactionId | 事务ID | 事务消息 |
消息位点(MessageQueueOffset):
消息按到达服务端的先后顺序存储在队列中,每条消息在队列中有一个唯一的 Long 类型坐标,称为消息位点。
消费模型
集群消费(Clustering)
集群消费是最常用的消费模式,同一消费者组内的消费者共同分担消息消费。
特点:
- 消费者组内每个消费者消费部分消息
- 一条消息只会被一个消费者消费
- 适合分布式处理场景
广播消费(Broadcasting)
广播消费模式下,每条消息会被消费者组内的所有消费者消费。
特点:
- 每个消费者消费全部消息
- 适合需要所有节点都处理同一消息的场景
- 消费进度由各消费者独立维护
两种模式对比:
| 特性 | 集群消费 | 广播消费 |
|---|---|---|
| 消息分发 | 组内分担 | 组内广播 |
| 消费进度 | Broker 维护 | Consumer 维护 |
| 扩展性 | 水平扩展 | 无扩展优势 |
| 适用场景 | 分布式处理 | 配置同步、缓存刷新 |
消息过滤
Tag 过滤
Tag 是消息的标签属性,可以在 Topic 下做更细粒度的分类。
// 发送消息时设置 Tag
Message msg = new Message("TopicTest", "TagA", "Hello".getBytes());
// 消费时订阅特定 Tag
consumer.subscribe("TopicTest", "TagA || TagB");
Tag 过滤规则:
| 表达式 | 说明 |
|---|---|
TagA | 只消费 TagA 的消息 |
TagA || TagB | 消费 TagA 或 TagB 的消息 |
* | 消费所有消息 |
SQL92 过滤
SQL92 过滤支持更复杂的过滤条件,基于消息属性进行过滤。
// 发送消息时设置属性
Message msg = new Message("TopicTest", "Hello".getBytes());
msg.putUserProperty("age", "18");
msg.putUserProperty("level", "VIP");
// 消费时使用 SQL92 语法过滤
consumer.subscribe("TopicTest",
MessageSelector.bySql("age > 16 AND level = 'VIP'"));
SQL92 支持的语法:
- 比较运算:
=, >, <, >=, <=, <> - 逻辑运算:
AND, OR, NOT - 范围运算:
BETWEEN, IN - 空值判断:
IS NULL, IS NOT NULL
小结
本章介绍了 RocketMQ 的核心概念:
- NameServer:路由注册中心,轻量级无状态设计
- Broker:消息存储和转发服务器
- Producer:消息生产者
- Consumer:消息消费者
- Topic:消息主题,顶层容器
- MessageQueue:消息队列,最小存储单元
- Message:消息,最小传输单元
- 消费模型:集群消费和广播消费
- 消息过滤:Tag 过滤和 SQL92 过滤
理解这些概念是使用 RocketMQ 的基础,后续章节将详细介绍消息的发送和消费。