rocketmq name server

RocketMQ Name Server 架构和使用示例

1. 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                    RocketMQ 集群架构                             │
└─────────────────────────────────────────────────────────────────┘

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ Name Server │    │ Name Server │    │ Name Server │
│   (主节点)   │    │   (备节点)  │    │   (备节点)   │
│   :9876     │    │   :9877     │    │   :9878     │
└─────────────┘    └─────────────┘    └─────────────┘
       │                   │                   │
       └───────────────────┼───────────────────┘
                           │
                    ┌─────────────┐
                    │   Broker    │
                    │  Master A   │
                    │   :10911    │
                    └─────────────┘
                           │
                    ┌─────────────┐
                    │   Broker    │
                    │  Slave A    │
                    │   :10912    │
                    └─────────────┘
                           │
                    ┌─────────────┐
                    │   Broker    │
                    │  Master B   │
                    │   :10913    │
                    └─────────────┘
                           │
                    ┌─────────────┐
                    │   Broker    │
                    │  Slave B    │
                    │   :10914    │
                    └─────────────┘

2. 组件交互流程图

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  Producer   │    │ Name Server │    │  Consumer   │
│             │    │             │    │             │
└─────────────┘    └─────────────┘    └─────────────┘
       │                   │                   │
       │ 1. 获取路由信息    │                   │
       ├──────────────────►│                   │
       │                   │                   │
       │ 2. 返回Topic路由   │                   │
       │◄──────────────────┤                   │
       │                   │                   │
       │ 3. 发送消息        │                   │
       ├───────────────────┼──────────────────►│
       │                   │                   │
       │                   │ 4. 获取路由信息    │
       │                   │◄──────────────────┤
       │                   │                   │
       │                   │ 5. 返回Topic路由   │
       │                   ├──────────────────►│
       │                   │                   │
       │                   │ 6. 拉取消息        │
       │                   │◄──────────────────┤

3. Name Server 核心功能

3.1 路由管理

  • Topic 路由信息存储:维护所有 Topic 的路由表
  • Broker 注册:接收 Broker 的心跳注册
  • 路由发现:为 Producer 和 Consumer 提供路由信息

3.2 服务发现

  • Broker 列表维护:维护活跃的 Broker 列表
  • 负载均衡:为消息发送提供负载均衡策略
  • 故障转移:检测 Broker 故障并更新路由

4. 配置示例

4.1 Name Server 配置 (namesrv.conf)

# 监听端口
listenPort=9876

# 数据存储路径
storePathRootDir=/opt/rocketmq/nameserver

# 集群配置
clusterName=DefaultCluster

# 日志配置
logLevel=INFO
logPath=/opt/rocketmq/logs/nameserver

4.2 Broker 配置 (broker.conf)

# Broker 名称
brokerName=broker-a

# Broker ID (0=Master, >0=Slave)
brokerId=0

# Name Server 地址
namesrvAddr=192.168.1.100:9876;192.168.1.101:9876

# 监听端口
listenPort=10911

# 数据存储路径
storePathRootDir=/opt/rocketmq/store
storePathCommitLog=/opt/rocketmq/store/commitlog
storePathConsumeQueue=/opt/rocketmq/store/consumequeue

5. 使用示例

5.1 Producer 示例

public class RocketMQProducer {
    private DefaultMQProducer producer;
    
    public void init() throws Exception {
        producer = new DefaultMQProducer("producer_group");
        // 设置 Name Server 地址
        producer.setNamesrvAddr("192.168.1.100:9876;192.168.1.101:9876");
        producer.start();
    }
    
    public void sendMessage() throws Exception {
        Message msg = new Message("TopicTest", "TagA", 
            "Hello RocketMQ".getBytes(RemotingHelper.DEFAULT_CHARSET));
        SendResult result = producer.send(msg);
        System.out.println("发送结果: " + result);
    }
}

5.2 Consumer 示例

public class RocketMQConsumer {
    private DefaultMQPushConsumer consumer;
    
    public void init() throws Exception {
        consumer = new DefaultMQPushConsumer("consumer_group");
        // 设置 Name Server 地址
        consumer.setNamesrvAddr("192.168.1.100:9876;192.168.1.101:9876");
        consumer.subscribe("TopicTest", "*");
        
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(
                List<MessageExt> messages,
                ConsumeConcurrentlyContext context) {
                for (MessageExt message : messages) {
                    System.out.println("收到消息: " + new String(message.getBody()));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        
        consumer.start();
    }
}

6. 部署脚本示例

6.1 启动 Name Server

#!/bin/bash
# start-nameserver.sh

export ROCKETMQ_HOME=/opt/rocketmq
export NAMESRV_ADDR=192.168.1.100:9876

nohup sh $ROCKETMQ_HOME/bin/mqnamesrv > $ROCKETMQ_HOME/logs/namesrv.log 2>&1 &
echo "Name Server 启动完成"

6.2 启动 Broker

#!/bin/bash
# start-broker.sh

export ROCKETMQ_HOME=/opt/rocketmq
export NAMESRV_ADDR=192.168.1.100:9876

nohup sh $ROCKETMQ_HOME/bin/mqbroker -n $NAMESRV_ADDR -c $ROCKETMQ_HOME/conf/broker.conf > $ROCKETMQ_HOME/logs/broker.log 2>&1 &
echo "Broker 启动完成"

7. 监控和管理

7.1 管理命令

# 查看集群信息
sh mqadmin clusterList -n 192.168.1.100:9876

# 查看 Topic 信息
sh mqadmin topicList -n 192.168.1.100:9876

# 查看 Broker 状态
sh mqadmin brokerStatus -n 192.168.1.100:9876 -b broker-a

# 创建 Topic
sh mqadmin updateTopic -n 192.168.1.100:9876 -t TopicTest -c DefaultCluster

7.2 健康检查

# 检查 Name Server 状态
telnet 192.168.1.100 9876

# 检查 Broker 状态
telnet 192.168.1.100 10911

8. 高可用配置

8.1 Name Server 集群

  • 部署多个 Name Server 实例
  • 使用负载均衡器分发请求
  • 配置自动故障转移

8.2 Broker 集群

  • Master-Slave 架构
  • 异步复制模式
  • 自动故障转移

9. 性能优化建议

  1. Name Server 优化

    • 增加 JVM 堆内存
    • 优化网络配置
    • 使用 SSD 存储
  2. Broker 优化

    • 调整刷盘策略
    • 优化消息存储
    • 配置合适的队列数量
  3. 网络优化

    • 使用专用网络
    • 配置网络缓冲区
    • 启用网络压缩

这个架构图展示了 RocketMQ Name Server 的核心组件、交互流程和实际使用示例,可以帮助您理解和使用 RocketMQ 消息队列系统。

posted @ 2025-09-02 11:26  ukyo--碳水化合物  阅读(5)  评论(0)    收藏  举报