RocketMQ 5.0 是一个重大版本更新,引入了众多新特性。本文将全面介绍 RocketMQ 5.0 的新特性、架构变化和升级方案。
一、架构演进
1.1 版本对比
RocketMQ 4.x 架构:
graph TB
subgraph NameServer 集群
NS1[NameServer 1]
NS2[NameServer 2]
end
subgraph Broker 集群
B1[Broker 1 Master]
B2[Broker 1 Slave]
end
P[Producer] --> NS1
C[Consumer] --> NS1
NS1 --> B1
RocketMQ 5.0 架构:
graph TB
subgraph Controller 集群
C1[Controller 1]
C2[Controller 2]
C3[Controller 3]
end
subgraph Proxy 集群
PX1[Proxy 1]
PX2[Proxy 2]
end
subgraph Broker 集群
B1[Broker 1]
B2[Broker 2]
end
P[Producer] --> PX1
C[Consumer] --> PX1
PX1 --> B1
PX1 --> B2
C1 -.->|管理 | B1
C1 -.->|管理 | B2
1.2 核心变化
| 特性 | 4.x | 5.0 | 说明 |
|---|---|---|---|
| 元数据管理 | NameServer | Controller | 强一致 |
| 代理层 | 无 | Proxy | 轻量代理 |
| 消费模式 | Pull/Push | POP | 避免重复 |
| 事件驱动 | 无 | EventBridge | 事件总线 |
| 云原生 | 有限 | 完善 | 容器友好 |
二、Controller 模式
2.1 核心优势
优势:
1. 元数据强一致
2. Broker 自动选举
3. 简化运维
4. 提高可用性
2.2 配置方法
Broker 配置:
# broker.conf
# 启用 Controller 模式
controllerMode=true
# Controller 地址
controllerAddr=controller-1:9878;controller-2:9879;controller-3:9880
# 启用自动切换
enableAutoSwitch=true
Controller 配置:
# controller.conf
# Raft 配置
controllerDLegerGroup=DefaultController
controllerDLegerPeers=n0-controller-1:9878;n1-controller-2:9879;n2-controller-3:9880
controllerDLegerSelfId=n0
# 存储路径
controllerStorePath=/data/rocketmq/controller
2.3 部署脚本
#!/bin/bash
# Controller 集群部署
CONTROLLERS=("controller-1" "controller-2" "controller-3")
for i in "${!CONTROLLERS[@]}"; do
controller=${CONTROLLERS[$i]}
node_id="n$i"
peers="n0-controller-1:9878;n1-controller-2:9879;n2-controller-3:9880"
# 创建配置
cat > /etc/rocketmq/controller-$node_id.conf << EOF
controllerDLegerGroup=DefaultController
controllerDLegerPeers=$peers
controllerDLegerSelfId=$node_id
controllerStorePath=/data/rocketmq/controller
listenPort=9878
EOF
# 启动
ssh $controller "mqcontroller -c /etc/rocketmq/controller-$node_id.conf &"
done
三、Proxy 代理
3.1 为什么需要 Proxy?
问题:
4.x 问题:
- 客户端直连 Broker
- 协议复杂
- 多语言支持差
- 鉴权分散
Proxy 解决方案:
Proxy 优势:
- 轻量代理层
- 简化客户端
- 统一鉴权
- 多语言友好
3.2 架构
graph TB
subgraph 客户端
P[Producer]
C[Consumer]
end
subgraph Proxy 集群
PX1[Proxy 1]
PX2[Proxy 2]
end
subgraph Broker 集群
B1[Broker 1]
B2[Broker 2]
end
P --> PX1
C --> PX1
PX1 --> B1
PX1 --> B2
3.3 配置使用
Proxy 配置:
# proxy.conf
# 基础配置
proxyClusterName=DefaultProxy
proxyName=proxy-1
# RocketMQ 地址
rocketMQProxyNameServers=ns1:9876;ns2:9876
# 监听端口
listenPort=8080
# 线程池配置
remotingWorkerThreads=16
客户端配置:
// 使用 Proxy
DefaultLitePullConsumer consumer = new DefaultLitePullConsumer("consumer-group");
consumer.setNamesrvAddr("proxy:8080"); // 指向 Proxy
consumer.start();
四、POP 消费模式
4.1 核心优势
POP 优势:
1. 消息独占消费
2. 避免重复消费
3. 自动续期机制
4. 支持负载均衡
4.2 配置使用
// 启用 POP 模式
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("pop-group");
consumer.setNamesrvAddr("ns1:9876");
// 启用 POP
consumer.setPop(true);
// 设置不可见时间
consumer.setInvisibleTime(30000); // 30 秒
consumer.subscribe("pop-topic", "*");
consumer.registerMessageListener((msgs, context) -> {
for (MessageExt msg : msgs) {
try {
processMessage(msg);
// 自动 Ack
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
} catch (Exception e) {
// 不 Ack,消息会重新可见
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
五、EventBridge 事件驱动
5.1 核心概念
EventBridge = 事件总线 + 路由 + 目标投递
功能:
- 事件发布/订阅
- 事件路由过滤
- 多目标投递
- 事件转换
5.2 使用示例
发布事件:
CloudEvent event = CloudEventBuilder.v1()
.withId(UUID.randomUUID().toString())
.withSource(URI.create("order-service"))
.withType("com.example.order.created")
.withDataContentType("application/json")
.withData(JSON.toJSONString(order).getBytes())
.build();
eventBridgeProducer.send("order-event-bus", event);
创建路由:
mqadmin createEventRule -n ns1:9876 \
-b order-event-bus \
-r order-created-rule \
-e '{"type": ["com.example.order.created"]}' \
-t '{"target": "order-topic", "type": "rocketmq"}'
六、云原生特性
6.1 容器化部署
# Kubernetes 部署
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rocketmq-broker
spec:
serviceName: rocketmq
replicas: 2
selector:
matchLabels:
app: rocketmq-broker
template:
metadata:
labels:
app: rocketmq-broker
spec:
containers:
- name: broker
image: apache/rocketmq:5.0.0
ports:
- containerPort: 10911
- containerPort: 10909
env:
- name: NAMESRV_ADDR
value: "rocketmq-namesrv:9876"
- name: BROKER_ID
value: "1"
volumeMounts:
- name: storage
mountPath: /root/store
volumeClaimTemplates:
- metadata:
name: storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
6.2 弹性伸缩
# HPA 配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: rocketmq-broker-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: StatefulSet
name: rocketmq-broker
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
七、升级迁移
7.1 升级路径
4.x → 5.0 升级路径:
方案 1:滚动升级
1. 升级 NameServer
2. 升级 Broker
3. 启用 Controller
4. 升级客户端
方案 2:并行部署
1. 部署 5.0 集群
2. 数据同步
3. 切换流量
4. 下线旧集群
7.2 升级脚本
#!/bin/bash
# 4.x 升级到 5.0
# 1. 备份配置
cp -r /etc/rocketmq /etc/rocketmq.bak
# 2. 停止服务
mqshutdown broker
mqshutdown namesrv
# 3. 升级二进制
wget https://archive.apache.org/dist/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip
unzip rocketmq-all-5.0.0-bin-release.zip
mv rocketmq-5.0.0 /opt/rocketmq
# 4. 更新配置
# 添加 Controller 配置
# 5. 启动服务
mqnamesrv -c /etc/rocketmq/namesrv.conf &
mqbroker -c /etc/rocketmq/broker.conf &
# 6. 验证
mqadmin clusterList -n ns1:9876
7.3 兼容性
| 特性 | 4.x | 5.0 | 兼容性 |
|---|---|---|---|
| 协议 | 私有 | 兼容 | 向后兼容 |
| 存储格式 | 相同 | 相同 | 完全兼容 |
| 客户端 | 4.x | 5.0 | 4.x 客户端可用 |
| NameServer | 必需 | 可选 | 混合模式 |
八、最佳实践
8.1 部署建议
推荐配置:
- Controller:3 节点(奇数)
- Proxy:2+ 节点
- Broker:主从架构
- 跨可用区部署
8.2 配置优化
# 5.0 优化配置
# Controller
controllerElectionTimeoutMs=2000
controllerHeartbeatIntervalMs=1000
# Proxy
proxyWorkerThreads=16
proxyRemotingWorkerThreads=16
# Broker
enableControllerMode=true
enablePop=true
8.3 监控指标
| 指标 | 说明 | 告警阈值 |
|---|---|---|
controller_leader | Controller Leader | != 1 |
proxy_connection_count | Proxy 连接数 | > 10000 |
pop_lock_count | POP 锁数量 | > 10000 |
event_delivery_rate | 事件投递率 | < 95% |
总结
RocketMQ 5.0 的核心要点:
- 架构演进:Controller、Proxy、POP、EventBridge
- Controller 模式:元数据强一致、自动选举
- Proxy 代理:轻量代理、简化客户端
- POP 消费:避免重复、独占消费
- EventBridge:事件驱动、多目标投递
- 云原生:容器化、弹性伸缩
核心要点:
- 理解架构变化和优势
- 掌握新特性配置方法
- 制定合理的升级方案
- 建立完善的监控体系
参考资料
- RocketMQ 5.0 官方文档
- RocketMQ 5.0 release notes
- 《RocketMQ 技术内幕》第 12 章