4. 单机RocketMQ环境搭建:使用Docker Compose部署单节点RocketMQ(NameServer + Broker)

在生产环境中,RocketMQ 通常以集群形式部署,但单节点环境是学习核心组件交互、验证配置变更、进行功能测试的基础。本章将使用 Docker Compose 在单机上快速搭建一个包含 NameServer 和 Broker 的完整 RocketMQ 实例,并验证消息的收发流程。

4.1 架构概览:单节点 RocketMQ 组件关系

在单节点部署中,NameServer 和 Broker 运行在同一台宿主机的不同容器中。NameServer 负责维护 Broker 的路由信息,而 Broker 负责消息的存储与转发。Producer 和 Consumer 通过 NameServer 发现 Broker 地址,再与 Broker 直接通信。

单节点 RocketMQ 组件关系图 单节点 RocketMQ 组件关系图 Producer Consumer NameServer (9876) Broker (10911) 发现路由 发现路由 发送消息 拉取消息 心跳注册 说明:单节点部署中,NameServer 和 Broker 运行在同一宿主机,Producer/Consumer 通过 NameServer 发现 Broker 地址。 端口映射:NameServer 9876,Broker 10911(服务端口)和 10909(HA 端口)。

4.2 环境准备与目录结构

在开始部署之前,需要确保宿主机已安装 Docker 和 Docker Compose。建议使用以下版本:

组件 最低版本 推荐版本 说明
Docker Engine 20.10.0 24.0.0+ 容器运行时
Docker Compose 1.29.0 2.20.0+ 多容器编排
RocketMQ 镜像 4.9.0 5.1.4 官方 apache/rocketmq

创建项目目录结构如下:

rocketmq-single/
├── docker-compose.yml
├── broker.conf
├── logs/
│   ├── namesrv/
│   └── broker/
└── store/
    ├── commitlog/
    ├── consumequeue/
    └── index/
最佳实践:将日志和数据目录挂载到宿主机,便于后续排查问题。store 目录存放消息数据,logs 目录存放运行日志。生产环境中建议将 store 目录挂载到高性能磁盘(如 SSD)。

4.3 编写 Broker 配置文件

Broker 的配置文件 broker.conf 是部署的核心。单节点部署时,需要特别注意 brokerIP1 的配置,确保 Producer 和 Consumer 能够正确连接到 Broker 容器。

# broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
# 关键配置:设置为宿主机 IP,否则客户端无法连接
brokerIP1 = 192.168.1.100
# 监听端口
listenPort = 10911
# 存储路径
storePathRootDir = /home/rocketmq/store
storePathCommitLog = /home/rocketmq/store/commitlog
# 自动创建 Topic
autoCreateTopicEnable = true
# 自动创建消费组
autoCreateSubscriptionGroup = true
# 消息存储时间(小时),默认 72 小时
fileReservedTime = 72
# 磁盘空间使用率警戒线,超过则拒绝写入
diskMaxUsedSpaceRatio = 85
避坑指南:brokerIP1 必须设置为宿主机 IP 或 0.0.0.0(需配合网络模式),不能设置为容器内部 IP(如 172.17.0.x)。否则客户端无法从外部连接 Broker,导致消息发送失败。

4.4 编写 Docker Compose 编排文件

docker-compose.yml 文件定义了 NameServer 和 Broker 两个服务。NameServer 先启动,Broker 后启动并注册到 NameServer。

version: '3.8'
services:
  namesrv:
    image: apache/rocketmq:5.1.4
    container_name: rmqnamesrv
    ports:
      - "9876:9876"
    volumes:
      - ./logs/namesrv:/home/rocketmq/logs
    environment:
      - JAVA_OPT_EXT=-Xms512m -Xmx512m -Xmn256m
    command: sh mqnamesrv
    networks:
      - rocketmq-net

  broker:
    image: apache/rocketmq:5.1.4
    container_name: rmqbroker
    ports:
      - "10911:10911"
      - "10909:10909"
    volumes:
      - ./broker.conf:/home/rocketmq/rocketmq-5.1.4/conf/broker.conf
      - ./logs/broker:/home/rocketmq/logs
      - ./store:/home/rocketmq/store
    environment:
      - JAVA_OPT_EXT=-Xms1g -Xmx1g -Xmn512m
    command: sh mqbroker -c /home/rocketmq/rocketmq-5.1.4/conf/broker.conf
    depends_on:
      - namesrv
    networks:
      - rocketmq-net

networks:
  rocketmq-net:
    driver: bridge

4.5 启动与验证

执行以下命令启动服务:

# 启动所有服务
docker-compose up -d

# 查看容器状态
docker-compose ps

# 查看 NameServer 日志
docker logs rmqnamesrv -f

# 查看 Broker 日志
docker logs rmqbroker -f

启动成功后,Broker 日志中应包含类似以下内容,表示已成功注册到 NameServer:

The broker[broker-a, 192.168.1.100:10911] boot success. serializeType=JSON
register broker to name server 172.18.0.2:9876 OK
Docker Compose 启动流程 Docker Compose 启动流程 1. docker-compose up -d 2. 启动 NameServer 3. 启动 Broker 4. Broker 注册到 NS 说明:Broker 启动后自动向 NameServer 注册,注册成功即可提供服务。

4.6 测试消息收发

使用 RocketMQ 官方提供的工具脚本进行消息收发测试。进入 Broker 容器执行:

# 进入 Broker 容器
docker exec -it rmqbroker bash

# 发送消息(默认 Topic: TestTopic)
sh tools.sh org.apache.rocketmq.example.quickstart.Producer

# 消费消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer

如果看到类似以下输出,说明环境搭建成功:

SendResult [sendStatus=SEND_OK, msgId=...
ConsumeMessageThread_1 Receive New Messages: [MessageExt...

4.7 常见问题与排查

问题现象 可能原因 解决方案
Broker 启动后立即退出 JVM 内存不足或配置文件错误 检查 JAVA_OPT_EXT 内存设置,确认 broker.conf 路径正确
客户端无法连接 Broker brokerIP1 配置为容器 IP 修改 brokerIP1 为宿主机 IP 或 0.0.0.0
消息发送超时 网络不通或端口未映射 检查 10911 端口映射,使用 telnet 测试连通性
磁盘空间不足 store 目录未挂载或空间满 清理 store 目录或调整 fileReservedTime