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 直接通信。
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
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 |