Docker 部署 RocketMQ 5.x

Apache RocketMQ 是一个分布式消息中间件系统,用于实现高可用、高性能的消息传递。

1、创建RocketMQ容器共享网络

RocketMQ有多个服务,需要分别创建容器,并且需要互相通信。

shell 复制代码
docker network create rocketmq
# docker network ls #列出已有docker网络
# docker network inspect rocketmq #查看网络信息

2、部署RocketMQ NameServer

NameServer 是专为 RocketMQ 设计的轻量级名称服务,具有简单、可集群横向扩展、无状态,节点之间互不通信等特点。

NameServer 是一个简单的 Topic 路由注册中心,其角色类似 Dubbo 中的 zookeeper,支持 Broker 的动态注册与发现。

NameServer 主要有两个功能:

  • Broker 管理:NameServer 接受 Broker 的注册请求,处理请求数据作为路由信息的基础数据。对 broker 进行心跳检测机制,检测是否还存活。
  • Topic 路由信息管理:每个 NameServer 都保存整个 Broker 集群的路由信息,用于 Producer 和 Conumser 查询的路由信息,从而进行消息的投递和消费。

部署命令:

shell 复制代码
# 创建映射目录, 并给rocketmq用户写权限
mkdir -p  /docker/volumes/rocketmq/logs
chmod o+w /docker/volumes/rocketmq/logs

# 启动NameServer
docker run -d --name mqnamesrv -p 9876:9876 --network rocketmq \
-v /docker/volumes/rocketmq/logs/:/home/rocketmq/logs \
apache/rocketmq:5.1.3 sh mqnamesrv

检查日志确认启动成功

3、部署Broker+Proxy

Broker是RocketMQ的核心,负责接收Producer发过来的消息、处理Consumer的消费请求、消息持久化存储、消息的HA机制以及服务端过滤等。每个Broker实例通常管理多个Topic。RocketMQ集群通常由多个Broker实例组成,以提高消息的可用性和吞吐量。

RocketMQ 5.x 引入Proxy,在客户端和Broker之间增加了一个Proxy代理层,对外屏蔽了NameServer、Broker的概念和调用,统一收敛由Proxy来负责提供消息发送、接收、调度控制等。Proxy让RocketMQ能够支持更多的外部协议如gRPC、HTTP。

5.x版本下,官方建议使用Local模式部署,即Broker和Proxy同进程部署。

部署命令:

shell 复制代码
docker run -d --name mqbroker -p 10911:10911 -p 10909:10909 --network rocketmq \
-v /docker/volumes/rocketmq/logs/:/home/rocketmq/logs \
apache/rocketmq:5.1.3 sh mqbroker -n mqnamesrv:9876 --enable-proxy autoCreateTopicEnable=true \
-c /home/rocketmq/rocketmq-5.1.3/conf/broker.conf

检查日志确认启动成功

shell 复制代码
docker exec -it mqbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log"

4、部署 RocketMQ Console

RocketMQ Console 是 rocketmq 的第三方扩展组件,提供图形界面便于管理和监控rocketmq。

RocketMQ Console 安装和使用 - rocketmq-console官方文档

部署命令

shell 复制代码
docker run -d --name mqconsole -p 8098:8080 --network rocketmq \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=mqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
styletang/rocketmq-console-ng

检查日志确认启动成功

浏览器输入 http://localhost:8098/ 打开 RocketMQ Console

5、创建Topic

Broker禁止生产者自动创建Topic,在mqbroker启动命令加上autoCreateTopicEnable=true即可开启自动创建。

推荐手动创建Topic,命令如下:

shell 复制代码
docker exec -it mqbroker bash
# 列出topic
sh mqadmin topicList -n mqnamesrv:9876
# 创建topic
sh mqadmin updateTopic -n mqnamesrv:9876 -b localhost:10911 -t test_topic
# 查看topic详情
sh mqadmin topicStatus -n mqnamesrv:9876 -t test_topic

也可以在RocketMQ Console创建

6、网络隔离导致生产者推送消息失败

我们使用SDK如rocketmq-client-python操作rocketmq时,一般是连接到NameServer地址,NameServer路由返回Broker地址。

但这里 NameServer 路由的 Broker 地址是 172.19.0.3:10911 这样的容器内部地址,容器外无法到达。

方法1(推荐)

修改Broker监听IP地址。

Broker有这两项配置:brokerIP1、brokerIP2,前者被NameServer返回给调用方,后者用于从节点同步。

这两项配置默认都是当前网卡地址,在容器中如 172.19.0.3。

现在我们将brokerIP1改成容器外可到达的地址,如localhost(mqbroker做了端口转发,localhost:10911->172.19.0.3:10911)

shell 复制代码
docker exec -it mqbroker bash
echo 'brokerIP1 = localhost' >> ~/rocketmq-5.1.3/conf/broker.conf
exit
docker restart mqbroker

检查修改是否成功

shell 复制代码
docker exec -it mqbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log"

注意这样修改后,RocketMQ Console会连不上Broker(Console中localhost不是指向broker),Linux机器考虑修改console网络模式为host

方法2

可以考虑创建一个python解释器容器,共享rocketmq的网络,在里面操作rocketmq就没有网络问题。

shell 复制代码
docker run -d --name python36 --network rocketmq python:3.6
docker exec -it python36 bash
python
>>> 
# 操作rocketmq

参考资料

快速开始 - Apache RocketMQ

RocketMQ---NameServer总结及核心源码剖析

第3天课程笔记_管理本地用户和组&控制文件访问

一览RocketMQ5.0

RocketMQ在Docker下的部署

爱折腾之docker部署RocketMq

相关推荐
不想睡觉的橘子君2 天前
【MQ】RabbitMQ、RocketMQ、kafka特性对比
kafka·rabbitmq·rocketmq
厌世小晨宇yu.3 天前
RocketMQ学习笔记
笔记·学习·rocketmq
洛卡卡了3 天前
如何选择最适合的消息队列?详解 Kafka、RocketMQ、RabbitMQ 的使用场景
kafka·rabbitmq·rocketmq
菜鸟起航ing4 天前
Spring Cloud Alibaba
spring cloud·java-ee·rocketmq
乄bluefox5 天前
学习RocketMQ(记录了个人艰难学习RocketMQ的笔记)
java·spring boot·中间件·rocketmq
虽千万人 吾往矣7 天前
golang rocketmq开发
开发语言·golang·rocketmq
HippoSystem7 天前
[RocketMQ 5.3.1] Win11 + Docker Desktop 本地部署全流程 + 踩坑记录
rocketmq
幸运小锦李先生12 天前
基于RabbitMQ,Redis,Redisson,RocketMQ四种技术实现订单延时关闭功能及其相关优缺点介绍(以12306为主题)
redis·rabbitmq·rocketmq·redisson·1024程序员节
₁ ₀ ₂ ₄13 天前
一篇文章了解RocketMQ基础知识。
分布式·中间件·rocketmq·1024程序员节
炭烤玛卡巴卡14 天前
【MacOS】RocketMQ 搭建Java客户端
macos·rocketmq·java-rocketmq