Skip to content
清晨的一缕阳光
返回

RocketMQ 5.0 新特性详解

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.x5.0说明
元数据管理NameServerController强一致
代理层Proxy轻量代理
消费模式Pull/PushPOP避免重复
事件驱动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.x5.0兼容性
协议私有兼容向后兼容
存储格式相同相同完全兼容
客户端4.x5.04.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_leaderController Leader!= 1
proxy_connection_countProxy 连接数> 10000
pop_lock_countPOP 锁数量> 10000
event_delivery_rate事件投递率< 95%

总结

RocketMQ 5.0 的核心要点:

  1. 架构演进:Controller、Proxy、POP、EventBridge
  2. Controller 模式:元数据强一致、自动选举
  3. Proxy 代理:轻量代理、简化客户端
  4. POP 消费:避免重复、独占消费
  5. EventBridge:事件驱动、多目标投递
  6. 云原生:容器化、弹性伸缩

核心要点

参考资料


分享这篇文章到:

上一篇文章
Redis 缓存一致性方案
下一篇文章
RocketMQ 核心源码分析与解读