RocketMQ环境搭建
常用组件
下载及安装
下载:https://rocketmq.apache.org/download
RocketMQ 是使用 Java 写的 MQ,需要先安装 JDK。
安装及配置
https://rocketmq.apache.org/docs/quickStart/01quickstart
启动 NameServer
NameServer 是 RocketMQ 的路由服务集群,它不保存任何消息数据,保存的是所有 Broker 的路由信息(包括 Broker 存活情况、各 topic 的路由信息等)。Producer 和 Consumer 在发送或订阅消息前,都需要先从 NameServer 获取 Broker 的路由信息,之后才能正确地与 Broker 通信。NameServer 支持集群部署,以确保高可用。
# start namesrv
$ nohup sh bin/mqnamesrv &
# verify namesrv
$ tail -f ~/logs/rocketmqlogs/namesrv.log
# 日志中出现下面的文本表示启动成功
The Name Server boot success...
默认端口 9876,检查端口占用情况
# Linux
netstat -an | grep 9876
# Windows
netstat -ano | findstr "9876"
启动 Broker
Broker 是 RocketMQ 的核心服务节点,负责接收来自 Producer 的消息、存储消息以及将消息转发给 Consumer 。在 RocketMQ 架构中,Broker 分为 Master 和 Slave 两种角色:
- Master Broker:处理消息的读写请求,是生产者发送消息和消费者消费消息的主要目标。
- Slave Broker:作为 Master Broker 的副本,主要用于备读或者故障切换,以提高系统的可用性。在 Master Broker出故障时,Slave Broker 里的消息依然可以被消费,或者直接被提升为新的 Master 继续提供服务。
Broker 的部署可以是单节点的,也可以是集群式的,甚至支持同机器、同进程混布的模式。需要先启动NameServer,再启动 Broker。Broker 启动后,会与 NameServer 保持长连接,每30s 发送一次发送心跳包,来确保Broker是否存活
### start broker
$ nohup sh bin/mqbroker -n localhost:9876 --enable-proxy &
### verify broker
$ tail -f ~/logs/rocketmqlogs/proxy.log
The broker[broker-a,192.169.1.2:10911] boot success...
在同一台机器上启动多个 broker 时提示:java.net.BindException: Address alread in use
如果不进行特殊指定,broker的默认端口是10911。所以一台机器上启动两个broker时,第二个broker就会出现端口被占用的错误。
解决办法:修改rocketmq的配置文件,增加listenPort配置。例如:
# MasterBroker1.properties
brokerClusterName=DefaultCluster
brokerName=MasterBroker1
brokerId=1
deleteWhen=04
listenPort=10911
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# SlaveBroker1.properties
brokerClusterName=DefaultCluster
brokerName=SlaveBroker1
brokerId=1
deleteWhen=04
# 监听端口
listenPort=10911
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
每个 broker 指定不同的配置启动:
$ nohup sh bin/mqbroker -n localhost:9876 --enable-proxy -c /path/to/MasterBroker1.properties &
$ nohup sh bin/mqbroker -n localhost:9876 --enable-proxy -c /path/to/SlaveBroker1.properties &
服务端口配置
Broker 涉及以下 3 个端口号
-
listenPort:此端口是broker的监听端口号,是remotingServer服务组件使用,作为对Producer和Consumer提供服务的端口号,默认为10911,可以通过配置文件修改。
-
fastListenPort:此端口号是fastRemotingServer服务组件使用,默认为listenPort - 2,可以通过配置文件修改。
-
haListenPort:此端口是HAService服务组件使用,用于Broker的主从同步,默认为listenPort - 1,可以通过配置文件修改。
关闭服务端
$ sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
$ sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
mqAdmin工具
https://rocketmq.apache.org/zh/docs/deploymentOperations/02admintool/
此命令支持-n参数指定 NameServer 的地址,可以通过设置 NAMESRV_ADDR 环境变量来避免每次输入 -n 参数。
export NAMESRV_ADDR=localhost:9876
Topic相关命令
包含 topic 查看,更新等操作
updateTopic |
创建或更新Topic | ./mqadmin updateTopic -n localhost:9876 -t YourTopicName -c DefaultCluster |
|---|---|---|
deleteTopic |
删除Topic | ./mqadmin deleteTopic -n localhost:9876 -t YourTopicName -c DefaultCluster |
topicList |
查看集群所有Topic列表 | ./mqadmin topicList -n localhost:9876 |
topicStatus |
查看Topic状态(消息堆积情况) | ./mqadmin topicStatus -n localhost:9876 -t YourTopicName |
topicRoute |
查看Topic的路由信息(队列分布在哪些Broker) | ./mqadmin topicRoute -n localhost:9876 -t YourTopicName |
参数解释:
-n (--namesrvAddr): NameServer 地址,格式为ip:port,多个用分号隔开。这是几乎所有命令都必需的参数。-t (--topic): Topic 名称。-c (--clusterName): 集群名称,默认为DefaultCluster。-w (--writeQueueNums): 写队列数(生产者数量),创建时可指定。-r (--readQueueNums): 读队列数(消费者数量),创建时可指定。-p (-perm): 权限(2|4|6),分别代表禁写|禁读|读写,默认为 6(读写)。
消息相关命令
查询、验证和处理消息的相关命令
queryMsgById |
通过MsgId查询消息 (最常用) | ./mqadmin queryMsgById -n localhost:9876 -i 7F00000100002A9F00000000000013B4 |
|---|---|---|
queryMsgByKey |
通过业务Key查询消息 | ./mqadmin queryMsgByKey -n localhost:9876 -t YourTopicName -k yourOrderId |
queryMsgByOffset |
在指定Broker上根据队列和偏移量查询消息 | ./mqadmin queryMsgByOffset -n localhost:9876 -b broker-a:10911 -i 0 -o 100 |
queryMsgByUniqueKey |
同 queryMsgById |
同 queryMsgById |
printMsg |
打印消息体内容(需要指定时间范围) | ./mqadmin printMsg -n localhost:9876 -t YourTopicName -s '2024-01-01 00:00:00' -e '2024-01-01 00:10:00' -d true |
| consumeMessage | 消费消息 (非常常用,用于检查消息内容) | ./mqadmin consumeMessage -n localhost:9876 -g YourConsumerGroup -t YourTopicName |
参数解释:
-i (--msgId): 消息的唯一 ID。-k (--msgKey): 发送消息时指定的业务 Key。-b (--brokerName): Broker 的名称(例如broker-a)。-g (--consumerGroup): 消费者组名称。-s / -e (--startTime / --endTime): 起始和结束时间。-d (--printBody): 是否打印消息体内容。
消费者组管理
用于监控和管理消费者的消费状态。
| 命令 | 说明 | 示例 |
|---|---|---|
| consumerProgress | 查看消费者组的消费进度/堆积情况 | ./mqadmin consumerProgress -n localhost:9876 -g YourConsumerGroup |
| consumerConnection | 查看消费者组的连接详情(客户端IP、版本等) | ./mqadmin consumerConnection -n localhost:9876 -g YourConsumerGroup |
| consumerStatus | 查看消费者的详细状态(已废弃,建议用consumerProgress) |
./mqadmin consumerStatus -n localhost:9876 -g YourConsumerGroup -t YourTopicName |
| deleteSubGroup | 删除消费者组 | ./mqadmin deleteSubGroup -n localhost:9876 -g YourConsumerGroup |
| resetOffsetByTime | 按时间重置消费偏移量 (非常常用,用于跳过堆积或重新消费) | ./mqadmin resetOffsetByTime -n localhost:9876 -g YourConsumerGroup -t YourTopicName -s now |
参数解释:
-g (--groupName): 消费者组名称。-s (--timestamp): 重置到的时间点,支持绝对时间 (2024-01-01 00:00:00) 或相对时间 (now,-1h)。
RocketMQ Dashboard
https://rocketmq.apache.org/zh/docs/4.x/deployment/03Dashboard/
RocketMQ Dashboard 是 RocketMQ 的可视化管理界面,目前官网似乎没有提供构建好的版本,因此需要自己通过源码进行构建。源码从 Github 下载:https://github.com/apache/rocketmq-dashboard。源码工程是一个常见的 SpringBoot Web项目。
项目是将前端项目和后端项目放在一起的,使用 com.github.eirslett:frontend-maven-plugin 这个 Maven 插件编译前端工程,使用下面的命令进行打包,注意选择 JDK8。
# 执行打包命令时会安装 node 和 yarn,此过程会去Github上下载 node 和 yarn 的安装包,连接 Github 网络不好的话可能会失败,
# 可以多尝试几次,如果不行则需要使用代理。
mvn clean package -Dmaven.test.skip=true
# 运行打包好的 springboot 程序, 并指定连接的NameServer地址
java -jar target/rocketmq-dashboard-*.jar --rocketmq.config.namesrvAddr=localhost:9876
配置需要连接 NameServer 的端口,修改配置文件 resource/application.properties
# RocketMQ Dashboard 服务本身的端口
server.port=8888
# 连接NameServer的地址
rocketmq.config.namesrvAddr=192.168.237.14:9876;192.168.237.9:9876
从源码进行环境搭建
首先从 Github 下载源码:https://github.com/apache/rocketmq,注意下载 release 分支。源码工程是个 maven 项目,下载后解压,直接用 IDE 打开即可。
本地启动
本地启动直接执行带 main 方法的类:
-
启动 NameServer:运行
org.apache.rocketmq.namesrv.NamesrvStartup -
启动 Broker:运行
org.apache.rocketmq.broker.BrokerStartup
这两个类可以在 mqnamesrv 和 mqbroker 这两个启动脚本里面找到,脚本也是通过启动 JVM 进程执行这两个带 main 方法的类进行启动的。
启动 NameServer
启动之前需要先配置一个 ROCKETMQ_HOME 环境变量
ROCKETMQ_HOME=D:\Develop\Code\Github\rocketmq-release-5.3.3
否则直接执行 NamesrvStartup 类会提示:Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation。可以直接在 Idea 的运行配置里添加环境变量,如下图所示:

启动成功控制台会打印:The Name Server boot success. serializeType=JSON, address 0.0.0.0:9876
修改启动配置
- 脚本支持的配置项,启动类也一样支持,通过参数传入即可,在 IDE 中如何向Java程序传参这里就不赘述了。
- 指定配置文件:
-c conf/namesrv.properties,此路径是相对于项目根目录的相对路径,内容如下:
listenPort=9092
启动 Broker
在项目中搜索 org.apache.rocketmq.broker.BrokerStartup 执行即可,执行此类同样需要添加 ROCKETMQ_HOME 环境变量
指定配置文件conf/broker1.conf,内容如下:
# 此Broker所在的集群名称
brokerClusterName = DefaultCluster
# Broker 节点名称
brokerName = broker1
# Broker的ID
brokerId = 0
# Broker的角色
brokerRole = ASYNC_MASTER
deleteWhen = 04
fileReservedTime = 48
flushDiskType = ASYNC_FLUSH
# 消息持久化存储根路径
storePathRootDir=D:/tmp/rocketmq/broker1/store
# 消息持久化存储路径
storePathCommitLog=D:/tmp/rocketmq/broker1/store/commitlog
# 连接NameServer的地址
namesrvAddr=127.0.0.1:9876
brokerIP1=127.0.0.1
autoCreateTopicEnable=true
# 如果要在单台机器上启动多台Broker,需要进行日志隔离,通过IDE启动建议配置这个
isolateLogEnable=true
# Broker 监听端口
listenPort=10911
启动Broker的时候会出现很多logback自身的启动日志,用处不大,可通过修改 broker 所在模块下 logback 配置文件关闭这些日志。
<configuration debug="false">
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
...
<configuration>
模块介绍
| 名称 | 作用 |
|---|---|
| acl | RocketMQ 的访问权限控制 |
| broker | RocketMQ 的核心模块之一:用于接收消息发送方的请求,主要包括消息处理、存储、以及高可用相关的功能 |
| client | RocketMQ 的核心模块之一:消息发送方依赖该模块把消息发送至 broker |
| common | RocketMQ 的基础模块:提供一些基础工具以及功能定义 |
| distribution | RocketMQ 中的一些核心配置以及服务的功能脚本 |
| example | RocketMQ 的功能示例 |
| filter | RocketMQ 的消息过滤机制 |
| logappender | RocketMQ 的日志 Appender 适配 |
| logging | RocketMQ 的日志框架适配 |
| namesrv | RocketMQ 的名称服务,主要保存服务的元信息,包括: broker、主题相关的信息 |
| openmessaging | RocketMQ 对于 openmessaging 规范的实现 |
| remoting | RocketMQ 各个进程之间的相互通信模块,主要是通过 NIO 框架 Netty 来实现的 |
| srvutil | 服务的一些工具类 |
| store | RocketMQ 消息的日志持久化 |
| test | RocketMQ 项目的测试用例 |
| tools | RocketMQ工具模块,包含命令接口、管理接口、监控接口 |

浙公网安备 33010602011771号