跳到主要内容

核心概念

理解 RocketMQ 的核心概念是使用好运消息中间件的基础。本章将详细介绍 RocketMQ 的各个核心组件和概念。

架构概览

RocketMQ 采用分布式集群架构,主要由以下四个核心组件构成:

核心组件

NameServer(名字服务器)

NameServer 是 RocketMQ 的路由注册中心,类似于注册中心,负责管理整个集群的路由信息。

核心职责

  • 路由注册:接收 Broker 的注册信息,维护 Topic 与 Broker 的映射关系
  • 路由发现:为 Producer 和 Consumer 提供路由信息,帮助它们找到对应的 Broker
  • 路由剔除:检测 Broker 的存活状态,自动剔除不可用的 Broker

特点

  • 无状态设计,各 NameServer 节点之间不通信
  • 轻量级,性能极高
  • 支持多节点部署,任意节点宕机不影响服务

为什么不使用 ZooKeeper?

RocketMQ 早期版本使用 ZooKeeper,后来改为自研 NameServer,原因如下:

  1. 简化架构:NameServer 功能单一,无需复杂的选主逻辑
  2. 性能更高:NameServer 内存存储,响应速度更快
  3. 运维简单:无需额外维护 ZooKeeper 集群

Broker(消息代理)

Broker 是 RocketMQ 的核心组件,负责消息的存储、索引和转发。

核心职责

  • 消息存储:接收生产者发送的消息,持久化存储
  • 消息投递:根据消费请求将消息投递给消费者
  • 消息索引:构建消息索引,支持按 Key 查询消息
  • 主从同步:支持主从架构,保证数据高可用

Broker 架构

重要配置参数

参数说明默认值
brokerNameBroker 名称机器主机名
brokerIdBroker ID(0 表示 Master)0
listenPortBroker 监听端口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 上实现水平扩展

队列的作用

  1. 水平扩展:通过增加队列数量提高并发能力
  2. 负载均衡:消费者组内各消费者分担不同队列的消费
  3. 顺序保证:同一队列内的消息严格按顺序存储
// 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 的核心概念:

  1. NameServer:路由注册中心,轻量级无状态设计
  2. Broker:消息存储和转发服务器
  3. Producer:消息生产者
  4. Consumer:消息消费者
  5. Topic:消息主题,顶层容器
  6. MessageQueue:消息队列,最小存储单元
  7. Message:消息,最小传输单元
  8. 消费模型:集群消费和广播消费
  9. 消息过滤:Tag 过滤和 SQL92 过滤

理解这些概念是使用 RocketMQ 的基础,后续章节将详细介绍消息的发送和消费。

延伸阅读