RocketMQ
什么是消息队列(message queue)
消息队列就是基础数据结构中的 先进先出 的一种数据机构,可以简单的理解为生活中买东西时的排队消费,先排队,先消费、结算。
消息队列主要解决问题:流量削峰、消息分发、异步消息
1、流量削峰:例如系统最多可以处理1万条请求,但在高峰期的时间有更多的请求,这个时候我们就需要消息队列来作为中间的缓冲区,将请求分散为一段时间处理,虽然延长了反应时间,但是总要好过请求失败。
2、消息分发:A会产生数据,B对数据感兴趣,如果没有消息的队列 A每次处理完就需要调用一下B服务,过一段时间后,C也对数据感兴趣,A就需要在处理完后分别调用B、C,在消费者多的情况下,非常不方便。有了消息队列后,A只管发送一次消息,B对消息感兴趣,只需要监听消息。C感兴趣,C也去监听消息。A服务作为基础服务不需要做改动。
3、异步消息:有些服务间的调用是异步的,例如A调用B,B需要花费很长时间执行,但是A需要知道B什么时候可以执行完,以前一般有两种方式,A过一段时间去调用B的查询api查询。使用消息队列,可以很方便解决这个问题,A调用B服务后,只需要监听B处理完成的消息,当B处理完成后,会发送一条消息给MQ,MQ会将此消息转发给A服务。
消息队列现状
截至2021.07,市面上主流的消息队列(message queue)有:RabbitMQ、Apache Kafka、Apache Pulsar、Apache RocketMQ等。
各家的消息队列各有优劣,对于我们使用者来说,消息队列的选型主要依靠以下的这几个方面决定。
1、可靠性:分布式架构(高可用)、故障修复转移、消息队列数据丢失
2、性能:吞吐量、实效性(延时)
3、功能维度:优先级队列、消费模式、跨语言的支持、安全机制等
4、运维管理:社区文档、集群扩容、版本更新、集群监控
5、社区生态、活跃程度:bug修复、新功能、性能优化
Apache RocketMQ基本概念
RocketMQ主要由 Producer、Broker、Consumer、NameServer组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息,NameServer是Topic路由注册中心,支持Broker的动态注册与发现。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。

代理服务器(Broker Server)
Broker主要负责消息的存储、投递和查询以及服务高可用保证,为了实现这些功能,Broker包含了以下几个重要子模块。
- Remoting Module:整个Broker的实体,负责处理来自clients端的请求。
- Client Manager:负责管理客户端(Producer/Consumer)和维护Consumer的Topic订阅信息
- Store Service:提供方便简单的API接口处理消息存储到物理硬盘和查询功能。
- HA Service:高可用服务,提供Master Broker 和 Slave Broker之间的数据同步功能。
- Index Service:根据特定的Message key对投递到Broker的消息进行索引服务,以提供消息的快速查询。
名字服务(Name Server)
NameServer是一个非常简单的Topic路由注册中心,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活。路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息。
主题(Topic)
表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。
订阅与发布(Sub/Pub)
消息的发布是指某个生产者向某个topic发送消息。消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据。
RocketMQ部署
环境状态
64bit Linux、64bit JDK 1.8+、Maven 3.2.x
jdk和maven安装
我们首先安装jdk和maven
#jdk安装
wget https://mirrors.huaweicloud.com/java/jdk/8u152-b16/jdk-8u152-linux-x64.tar.gz
tar -zxvf jdk-8u152-linux-x64.tar.gz
mv jdk1.8.0_152/ /usr/local/jdk
vim /etc/profile
#追加
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH
source /etc/profile
[root@rocketmq1 local]# java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)
#Maven安装
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz
tar -zxvf apache-maven-3.2.5-bin.tar.gz
mv apache-maven-3.2.5 /usr/local/maven-3.2
vim /etc/profile
#追加
export MAVEN_HOME=/usr/local/maven-3.2
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
[root@rocketmq1 dledger-dledger-0.2.2]# mvn -version
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
Maven home: /usr/local/maven-3.2
Java version: 1.8.0_152, vendor: Oracle Corporation
Java home: /usr/local/jdk/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
rocketmq构建
wget https://github.com/apache/rocketmq/archive/refs/tags/rocketmq-all-4.9.0.tar.gz
tar -zxvf rocketmq-all-4.9.0.tar.gz
cd rocketmq-rocketmq-all-4.9.0/
mvn -Prelease-all -DskipTests clean install -U
cd distribution/target/rocketmq-4.9.0/rocketmq-4.9.0
各种模式的配置文件
在 conf 目录下,RocketMQ 提供了多种 Broker 的配置文件:
broker.conf:单主,异步刷盘。2m/:双主,异步刷盘。2m-2s-async/:两主两从,异步复制,异步刷盘。2m-2s-sync/:两主两从,同步复制,异步刷盘。dledger/:Dledger 集群,至少三节点。
多Master多Slave模式-异步复制
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:
- 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样。
- 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。
多Master多Slave模式-同步双写
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:
- 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。
- 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

初次运行报错
1、RocketMq默认不支持jdk1.8以上,如果要使用,需要改各种脚本、环境变量。
-Djava.ext.dirs=/usr/local/jdk-10/jre/lib/ext:/home/rocketmq/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/../lib:/usr/local/jdk-10/lib/ext is not supported. Use -classpath instead.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
2、将 broker 的 master 和 slave 节点放在同一台机器上,配置的storePath相同导致的,修改配置文件,改为不同的路径。
java.lang.RuntimeException: Lock failed,MQ already started
at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:214)
at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:827)
at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
内存设置
RocketMQ默认配置是比较好的,这样可以直接应用于生产环境,所以如果机器内存较小,可以手动调整JVM的配置,可以先编辑bin/mqbroker会看到最后还是调用了bin/runbroker.sh,这里打开bin/runbroker.sh,找到jvm启动配置如下:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512M"
Java虚拟机的参数堆设置
-server:作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存大小,Server端JVM最好将-Xms和-Xmx设为相同值
-Xmx:堆内存最大值,建议不要超过物理内存的一半
-Xmn:一般设置为Xmx的三分之一
集群部署
节点规划
| 节点1 | 节点2 |
|---|---|
| nameserver1 | nameserver2 |
| broker-a-master | broker-b-maser |
| broker-b-slave | broker-a-maser |
| 192.168.31.205 | 192.168.31.206 |
配置文件:
broker-a.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=ASYNC_MASTER
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
flushDiskType=SYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=10911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.31.205:9876;192.168.31.206:9876
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.31.205
#存储路径
storePathRootDir=/home/rocketmq-all-4.9.0-source-release/data/store-a
#commitLog 存储路径
storePathCommitLog=/home/rocketmq-all-4.9.0-source-release/data/store-a/commitlog
#消费队列存储路径存储路径
storePathConsumerQueue=/home/rocketmq-all-4.9.0-source-release/data/store-a/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketmq-all-4.9.0-source-release/data/store-a/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketmq-all-4.9.0-source-release/data/store-a/checkpoint
#abort 文件存储路径
abortFile=/home/rocketmq-all-4.9.0-source-release/data/store-a/abort
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
broker-b-s.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=SLAVE
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
flushDiskType=SYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=11011
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.31.205:9876;192.168.31.206:9876
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.31.205
#存储路径
storePathRootDir=/home/rocketmq-all-4.9.0-source-release/data/store-b
#commitLog 存储路径
storePathCommitLog=/home/rocketmq-all-4.9.0-source-release/data/store-b/commitlog
#消费队列存储路径存储路径
storePathConsumerQueue=/home/rocketmq-all-4.9.0-source-release/data/store-b/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketmq-all-4.9.0-source-release/data/store-b/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketmq-all-4.9.0-source-release/data/store-b/checkpoint
#abort 文件存储路径
abortFile=/home/rocketmq-all-4.9.0-source-release/data/store-b/abort
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
不同的Broker之间修改brokerName、storePathRootDir相关路径等信息
启动nameserver
nohup sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqnamesrv &
启动broker
#节点1执行:
sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-a.properties &
sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-b-s.properties &
#节点2执行:
sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-b.properties &
sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-a-s.properties &
查看状态
[root@rocketmq1 rocketmq-4.9.0]# jps
1521 NamesrvStartup
1427 BrokerStartup
1549 BrokerStartup
1661 Jps
[root@rocketmq1 rocketmq-4.9.0]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.31.205:22 0.0.0.0:* LISTEN 938/sshd
tcp6 0 0 :::9876 :::* LISTEN 1521/java
tcp6 0 0 :::10909 :::* LISTEN 1427/java
tcp6 0 0 :::10911 :::* LISTEN 1427/java
tcp6 0 0 :::10912 :::* LISTEN 1427/java
tcp6 0 0 :::11009 :::* LISTEN 1549/java
tcp6 0 0 :::11011 :::* LISTEN 1549/java
tcp6 0 0 :::11012 :::* LISTEN 1549/java
/home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
[root@rocketmq1 rocketmq-4.9.0]# /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
#Cluster Name #Broker Name #BID #Addr #Version #InTPS(LOAD) #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
rocketmq-cluster broker-a 0 192.168.31.205:10911 V4_9_0 0.00(0,0ms) 0.00(0,0ms) 0 452165.45 -1.0000
rocketmq-cluster broker-a 1 192.168.31.206:11011 V4_9_0 0.00(0,0ms) 0.00(0,0ms) 0 452165.45 0.0079
rocketmq-cluster broker-b 0 192.168.31.206:10911 V4_9_0 0.00(0,0ms) 0.00(0,0ms) 0 452165.45 -1.0000
rocketmq-cluster broker-b 1 192.168.31.205:11011 V4_9_0 0.00(0,0ms) 0.00(0,0ms) 0 452165.45 0.0079
故障迁移测试
集群Master宕机无法进行故障转移
2主2从集群搭建好了,但是这种集群没有容灾能力,也就是说假如一台master挂了,没有办法选举一个新的master出来。
把broker-a的master(192.168.31.205:10911)服务停掉看一下:
[root@rocketmq1 rocketmq-4.9.0]# kill -9 1427
[root@rocketmq1 rocketmq-4.9.0]# /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
#Cluster Name #Broker Name #BID #Addr #Version #InTPS(LOAD) #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
rocketmq-cluster broker-a 1 192.168.31.206:11011 V4_9_0 0.00(0,0ms) 0.00(0,0ms) 0 452165.47 0.0079
rocketmq-cluster broker-b 0 192.168.31.206:10911 V4_9_0 0.00(0,0ms) 0.00(0,0ms) 0 452165.47 -1.0000
rocketmq-cluster broker-b 1 192.168.31.205:11011 V4_9_0 0.00(0,0ms) 0.00(0,0ms) 0 452165.47 0.0079
broker-a 的slave节点并不能升级为master节点。
这种部署模式,提供了一定的高可用性。但这样的部署模式,有一定的缺陷。比如故障转移方面,如果主节点挂了,还需要人为手动进行重启或者切换,无法自动将一个从节点转换为主节点。
Dledger集群
在 RocketMQ 4.5 版本之前,RocketMQ 只有 Master/Slave 一种部署方式,一组 broker 中有一个 Master ,有零到多个 Slave,Slave 通过同步复制或异步复制的方式去同步 Master 数据。
RocketMQ-on-DLedger Group 是指一组 相同名称的Broker,至少需要 3 个节点,通过 Raft自动选举出一个 Leader,其余节点作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用。
RocketMQ-on-DLedger Group 能自动容灾切换,并保证数据一致。 是可以水平扩展的,也即可以部署任意多个,同时对外提供服务。
配置文件
[root@rocketmq1 dledger]# pwd
/home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/dledger
[root@rocketmq1 dledger]# ll
总用量 12
-rwxr-xr-x. 1 root root 1155 6月 10 06:35 broker-n0.conf
-rwxr-xr-x. 1 root root 1155 6月 10 06:35 broker-n1.conf
-rwxr-xr-x. 1 root root 1155 6月 10 06:35 broker-n2.conf
brokerClusterName = RaftCluster
brokerName=RaftNode-mq2
listenPort=30911
namesrvAddr="192.168.31.205:9876;192.168.31.206:9876;192.168.31.207:9876"
storePathRootDir=/home/rocketmq-all-4.9.0-source-release/data/mqstore/RaftNode-mq2
storePathCommitLog=/home/rocketmq-all-4.9.0-source-release/data/mqstore/commitlog
#是否启动DLedger
enableDLegerCommitLog=true
#DLedger Raft Group 的名字,建议和 brokerName 保持一致
dLegerGroup=RaftNode-mq2
#DLedger Group 内各节点的地址与端口信息(同一个 Group 内的各个节点配置必须要保证一致)
dLegerPeers=n0-192.168.31.206:40911;n1-192.168.31.207:40912;n2-192.168.31.205:40913
#节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一,例如:第一个节点配置为”n0”,第二个节点配置为”n1”,第三个节点配置为”n2”
dLegerSelfId=n0
#发送线程个数(建议配置成 CPU 核数)
sendMessageThreadPoolNums=4
将服务启动,启动完成后查询:

然后我们kill掉其中的一个master节点,进程192.168.31.205:30921

我们可以看到,原来的192.168.31.207:30911节点变成了主节点(BID=0)然后我们重新启动原来的master

Dledger集群可以实现故障切换。
RocketMQ--性能测试
工具清单
consumer.sh:消息消费的benchmark工具
producer.sh: 消息生产benchmark工具(同步非批处理模式)
[root@rocketmq1 benchmark]# pwd
/home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/benchmark
[root@rocketmq1 benchmark]# sh producer.sh -h
[root@rocketmq1 benchmark]# Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=320m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
usage: benchmarkProducer [-a <arg>] [-h] [-k <arg>] [-l <arg>] [-m <arg>] [-n <arg>] [-q <arg>] [-s <arg>] [-t
<arg>] [-w <arg>]
-a,--aclEnable <arg> Acl Enable, Default: false
-h,--help Print help
-k,--keyEnable <arg> Message Key Enable, Default: false
-l,--tagCount <arg> Tag count, Default: 0
-m,--msgTraceEnable <arg> Message Trace Enable, Default: false
-n,--namesrvAddr <arg> Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
-q,--messageQuantity <arg> Send message quantity, Default: 0, running forever
-s,--messageSize <arg> Message Size, Default: 128
-t,--topic <arg> Topic name, Default: BenchmarkTest
-w,--threadCount <arg> Thread count, Default: 64
producer命令参数
-k 是否使用message key,true则使用timestamp作为message的key
-n 指定nameserver地址, 例如:192.168.31.205:9876;192.168.31.206:9876;192.168.31.207:9876
-q 发送信息的条数,默认为0一直发送。
-s 指定消息大小,默认128字节
-t 指定topic,默认使用BenchmarkTest,如果指定其他记得先创建对应的topic
-w 开启的发送生产消息的线程数
producer返回结果
SendTPS:生产消息的TPS(Transactions Per Second 的缩写,每秒处理的事务数目)
Max RT:最大响应时间(毫秒)
Average RT:平均响应时间(毫秒)
Send Failed:发送失败的总请求数
Response Failed:返回失败的总响应数
[root@rocketmq1 benchmark]# sh consumer.sh -h
[root@rocketmq1 benchmark]# Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=320m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
usage: benchmarkConsumer [-a <arg>] [-e <arg>] [-f <arg>] [-g <arg>] [-h] [-m <arg>] [-n <arg>] [-p <arg>] [-r
<arg>] [-t <arg>] [-w <arg>]
-a,--aclEnable <arg> Acl Enable, Default: false
-e,--expression <arg> filter expression content file path.ie: ./test/expr
-f,--filterType <arg> TAG, SQL92
-g,--group <arg> Consumer group name, Default: benchmark_consumer
-h,--help Print help
-m,--msgTraceEnable <arg> Message Trace Enable, Default: false
-n,--namesrvAddr <arg> Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
-p,--group suffix enable <arg> Consumer group suffix enable, Default: false
-r,--fail rate <arg> consumer fail rate, default 0
-t,--topic <arg> Topic name, Default: BenchmarkTest
-w,--threadCount <arg> Thread count, Default: 20
consumer命令参数
-e 配合filter参数使用,过滤的条件表达式
-f 过滤方式
-g 指定消费组,默认为benchmark_consumer
-n 指定nameserver地址,例如:192.168.31.205:9876;192.168.31.206:9876;192.168.31.207:9876
-p 是否给消费组添加后缀,默认会给指定的消费组后添加后缀
-r 指定消费失败率,只要没有超过消费失败率,消费失败都会重试
-t 指定topic,默认使用BenchmarkTest,如果指定其他记得先创建对应的topic
-w 开启的接收消息的线程数
consumer返回结果
TPS: 消费的TPS(Transactions Per Second 的缩写,每秒处理的事务数目)
FAIL:消费失败的总数
AVG(B2C):broker到Consumer的平均响应时间(毫秒)
AVG(S2C):nameserver到Consumer的平均响应时间(毫秒)
MAX(B2C): broker到Consumer的最大响应时间(毫秒)
MAX(S2C): nameserver到Consumer的最大响应时间(毫秒)
我们运行producer.sh和consumer.sh简单看一下RocketMQ的性能。
生产者TPS
[root@rocketmq1 benchmark]# sh producer.sh -n 192.168.31.206:9876
[root@rocketmq1 benchmark]# Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=320m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
topic: BenchmarkTest threadCount: 64 messageSize: 128 keyEnable: false propertySize: 0 tagCount: 0 traceEnable: false aclEnable: false messageQuantity: 0
19:46:12.973 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
Current Time: 1627818382916 Send TPS: 5276 Max RT(ms): 462 Average RT(ms): 12.123 Send Failed: 0 Response Failed: 0
Current Time: 1627818392916 Send TPS: 4511 Max RT(ms): 462 Average RT(ms): 14.199 Send Failed: 0 Response Failed: 0
Current Time: 1627818402917 Send TPS: 3457 Max RT(ms): 1051 Average RT(ms): 18.555 Send Failed: 0 Response Failed: 0
Current Time: 1627818412916 Send TPS: 3854 Max RT(ms): 1051 Average RT(ms): 16.634 Send Failed: 0 Response Failed: 0
Current Time: 1627818422916 Send TPS: 3812 Max RT(ms): 1051 Average RT(ms): 16.821 Send Failed: 0 Response Failed: 0
Current Time: 1627818432916 Send TPS: 4615 Max RT(ms): 1051 Average RT(ms): 13.858 Send Failed: 0 Response Failed: 0
Current Time: 1627818442916 Send TPS: 4528 Max RT(ms): 1051 Average RT(ms): 14.138 Send Failed: 0 Response Failed: 0
Current Time: 1627818452916 Send TPS: 4578 Max RT(ms): 1051 Average RT(ms): 13.987 Send Failed: 0 Response Failed: 0
Current Time: 1627818462916 Send TPS: 4731 Max RT(ms): 1051 Average RT(ms): 13.545 Send Failed: 0 Response Failed: 0
Current Time: 1627818472916 Send TPS: 4719 Max RT(ms): 1051 Average RT(ms): 13.554 Send Failed: 0 Response Failed: 0
Current Time: 1627818482916 Send TPS: 4651 Max RT(ms): 1051 Average RT(ms): 13.765 Send Failed: 0 Response Failed: 0
Current Time: 1627818492916 Send TPS: 4247 Max RT(ms): 1056 Average RT(ms): 15.065 Send Failed: 0 Response Failed: 0
Current Time: 1627818502916 Send TPS: 4615 Max RT(ms): 1056 Average RT(ms): 13.873 Send Failed: 0 Response Failed: 0
Current Time: 1627818512916 Send TPS: 4461 Max RT(ms): 1056 Average RT(ms): 14.302 Send Failed: 0 Response Failed: 0
Current Time: 1627818522920 Send TPS: 4673 Max RT(ms): 1056 Average RT(ms): 13.672 Send Failed: 0 Response Failed: 0
Current Time: 1627818532916 Send TPS: 3952 Max RT(ms): 1056 Average RT(ms): 13.844 Send Failed: 0 Response Failed: 26
Current Time: 1627818542916 Send TPS: 4862 Max RT(ms): 1056 Average RT(ms): 13.147 Send Failed: 0 Response Failed: 26
消费者TPS
Current Time: 1627818393853 TPS: 15813 FAIL: 0 AVG(B2C) RT(ms): 8927713.640 AVG(S2C) RT(ms): 8927150.286 MAX(B2C) RT(ms): 8957517 MAX(S2C) RT(ms): 8957268
Current Time: 1627818403853 TPS: 121414 FAIL: 0 AVG(B2C) RT(ms): 8809188.316 AVG(S2C) RT(ms): 8808765.007 MAX(B2C) RT(ms): 8958431 MAX(S2C) RT(ms): 8958177
Current Time: 1627818413853 TPS: 114379 FAIL: 0 AVG(B2C) RT(ms): 8194979.611 AVG(S2C) RT(ms): 8194555.552 MAX(B2C) RT(ms): 8778402 MAX(S2C) RT(ms): 8778149
Current Time: 1627818423853 TPS: 61572 FAIL: 0 AVG(B2C) RT(ms): 6167205.915 AVG(S2C) RT(ms): 6166942.961 MAX(B2C) RT(ms): 8589939 MAX(S2C) RT(ms): 8589690
Current Time: 1627818433853 TPS: 4635 FAIL: 0 AVG(B2C) RT(ms): 16.493 AVG(S2C) RT(ms): -390.830 MAX(B2C) RT(ms): 144 MAX(S2C) RT(ms): 0
Current Time: 1627818443853 TPS: 4576 FAIL: 0 AVG(B2C) RT(ms): 16.859 AVG(S2C) RT(ms): -360.405 MAX(B2C) RT(ms): 110 MAX(S2C) RT(ms): 0
Current Time: 1627818453853 TPS: 4550 FAIL: 0 AVG(B2C) RT(ms): 16.788 AVG(S2C) RT(ms): -371.261 MAX(B2C) RT(ms): 119 MAX(S2C) RT(ms): 0
Current Time: 1627818463853 TPS: 4726 FAIL: 0 AVG(B2C) RT(ms): 15.794 AVG(S2C) RT(ms): -402.021 MAX(B2C) RT(ms): 107 MAX(S2C) RT(ms): 0
Current Time: 1627818473853 TPS: 4805 FAIL: 0 AVG(B2C) RT(ms): 16.345 AVG(S2C) RT(ms): -388.560 MAX(B2C) RT(ms): 129 MAX(S2C) RT(ms): 0
Current Time: 1627818483853 TPS: 4576 FAIL: 0 AVG(B2C) RT(ms): 15.676 AVG(S2C) RT(ms): -395.823 MAX(B2C) RT(ms): 280 MAX(S2C) RT(ms): 30
Current Time: 1627818493853 TPS: 4287 FAIL: 0 AVG(B2C) RT(ms): 18.059 AVG(S2C) RT(ms): -344.192 MAX(B2C) RT(ms): 103 MAX(S2C) RT(ms): 0
Current Time: 1627818503853 TPS: 4660 FAIL: 0 AVG(B2C) RT(ms): 16.543 AVG(S2C) RT(ms): -391.125 MAX(B2C) RT(ms): 178 MAX(S2C) RT(ms): 0
Current Time: 1627818513853 TPS: 4423 FAIL: 0 AVG(B2C) RT(ms): 17.403 AVG(S2C) RT(ms): -348.632 MAX(B2C) RT(ms): 133 MAX(S2C) RT(ms): 0
Current Time: 1627818523853 TPS: 4734 FAIL: 0 AVG(B2C) RT(ms): 15.806 AVG(S2C) RT(ms): -400.024 MAX(B2C) RT(ms): 209 MAX(S2C) RT(ms): 0
Current Time: 1627818533853 TPS: 3989 FAIL: 0 AVG(B2C) RT(ms): 15.950 AVG(S2C) RT(ms): -402.737 MAX(B2C) RT(ms): 487 MAX(S2C) RT(ms): 225
Current Time: 1627818543853 TPS: 4827 FAIL: 0 AVG(B2C) RT(ms): 15.824 AVG(S2C) RT(ms): -402.517 MAX(B2C) RT(ms): 140 MAX(S2C) RT(ms): 0
Current Time: 1627818553853 TPS: 4663 FAIL: 0 AVG(B2C) RT(ms): 15.906 AVG(S2C) RT(ms): -367.178 MAX(B2C) RT(ms): 141 MAX(S2C) RT(ms): 0
Current Time: 1627818563853 TPS: 4405 FAIL: 0 AVG(B2C) RT(ms): 17.627 AVG(S2C) RT(ms): -345.836 MAX(B2C) RT(ms): 172 MAX(S2C) RT(ms): 0
Current Time: 1627818573854 TPS: 4463 FAIL: 0 AVG(B2C) RT(ms): 16.608 AVG(S2C) RT(ms): -348.164 MAX(B2C) RT(ms): 159 MAX(S2C) RT(ms): 0

浙公网安备 33010602011771号