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

https://rocketmq-learning.com/course/deploy/rocketmq_learning-gvr7dx_awbbpb_bmpnil7eq36uy5fn/?spm=5176.29160081.0.0.54bf4a737aZOmd

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 个端口号

  1. listenPort:此端口是broker的监听端口号,是remotingServer服务组件使用,作为对Producer和Consumer提供服务的端口号,默认为10911,可以通过配置文件修改。

  2. fastListenPort:此端口号是fastRemotingServer服务组件使用,默认为listenPort - 2,可以通过配置文件修改。

  3. 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 方法的类:

  1. 启动 NameServer:运行 org.apache.rocketmq.namesrv.NamesrvStartup

  2. 启动 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 的运行配置里添加环境变量,如下图所示:

img

启动成功控制台会打印:The Name Server boot success. serializeType=JSON, address 0.0.0.0:9876

修改启动配置

  1. 脚本支持的配置项,启动类也一样支持,通过参数传入即可,在 IDE 中如何向Java程序传参这里就不赘述了。
  2. 指定配置文件:-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工具模块,包含命令接口、管理接口、监控接口
posted @ 2025-08-22 21:01  vonlinee  阅读(52)  评论(0)    收藏  举报