一、rocketMQ简介

  RocektMQ是阿里巴巴在2012年开源的一个纯java、分布式、队列模型的第三代消息中间件。

  2016年11月11号,双十一大促见证了RocketMQ低延迟存储架构的成功试水,99.996%的延迟落在了10ms以内,极个别由于GC引发的停顿在50ms以内,其高性能、低延时和高可靠的特性承载了近年来双十一17万笔/秒的交易峰值,在整个生产链路上都有着稳定和出色的表现。其在同年捐赠给Apache后正式进入孵化期。并于2017年9月RocketMQ正式从Apache社区正式毕业,成为Apache顶级项目。

二、相关术语

  1、消息模型(Message Model)

  RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。Consumer Group 由多个Consumer 实例构成。

  2、消息生产者(Producer)

  Producer:消息生产者,负责产生消息,一般由业务系统负责产生消息。

  Producer Group:一类Producer的集合名称,这类Producer通常发送一类消息,且发送逻辑一致。

  一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。

  3、消息消费者(Consumer)

  Consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费。
  Push Consumer:Consumer的一种,应用通常向Consumer对象注册一个Listener接口,一旦收到消息,Consumer对象立刻回调Listener接口方法。该消费模式一般实时性较高。
  Pull Consumer:Consumer的一种,应用通常主动调用Consumer的拉消息方法从Broker拉消息,主动权由应用控制。
  Consumer Group:一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致。

  4、代理服务器(Broker)

  消息中转角色,负责存储消息,转发消息,一般也称为Server。

  Master:Broker中的主节点。
  Slave:Broker中的副节点。

  5、名字服务(Name Server)

  名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,集群中Nameserver互相独立,彼此没有通信关系,单台Nameserver挂掉,不影响其他Nameserver,即使全部挂掉,也不影响业务系统使用。而且Nameserver不会有频繁的读写,所以性能开销非常小,稳定性很高。

  6、主题(Topic)

  表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。

  7、消息(Message)

  消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。

  8、消息队列(Message Queue)

  在RocketMQ中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,offset为java long类型,64位,理论上在100年内不会溢出,所以认为是长度无限,另外队列中只保存最近几天的数据,之前的数据会按照过期时间来删除。也可以认为Message Queue是一个长度无限的数组,offset就是下标。

  9、消费类型

  广播消费:一条消息被多个Consumer消费,即使这些Consumer属于同一个Consumer Group,消息也会被Consumer Group中的每个Consumer都消费一次,广播消费中的Consumer Group概念可以认为在消息划分方面无意义。

  集群消费:一个Consumer Group中的Consumer实例平均分摊消费消息。例如某个Topic有9条消息,其中一个Consumer Group有3个实例(可能是3个进程,或者3台机器),那么每个实例只消费其中的3条消息。

  10、消息顺序

  普通顺序消息:消费者通过同一个消费队列收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。主要指的是局部顺序,即一类消息为满足顺序性,必须Producer单线程顺序发送,且发送到同一个队列,这样Consumer就可以按照Producer发送的顺序去消费消息。但是一旦发生通信异常,Broker重启,由于队列总数发生变化,哈希取模后定位的队列会变化,产生短暂的消息顺序不一致。

  严格顺序消息:顺序消息的一种,无论正常异常情况都能保证顺序,但是牺牲了分布式Failover特性,即Broker集群中只要有一台机器不可用,则整个集群都不可用,服务可用性大大降低。如果服务器部署为同步双写模式,此缺陷可通过备机自动切换为主避免,不过仍然会存在几分钟的服务不可用。

  11、消息写入机制

  异步复制:消息写入master节点,再由master节点异步复制到slave节点,类似mysql中的master-slave机制。

  同步双写:消息同时写入master节点和slave节点。

  12、持久化策略

  异步刷盘:Broker的一种持久化策略,消息写入pagecache后,直接返回。由异步线程负责将pagecache写入硬盘。

  同步刷盘:Broker的一种持久化策略,消息写入pagecache后,由同步线程将pagecache写入硬盘后,再返回。

三、RocketMQ集群部署模式

  RocketMQ作为消息中间件,其主要功能为消息的Publish/Subscribe。而Broker担任的消息转发和存储功能,其部署方式有很多种:

  1、单Master

  优点:除了配置简单没什么优点。
  缺点:不可靠,该机器重启或宕机,将导致整个服务不可用。

  2、多Master

  优点:配置简单,性能最高。
  缺点:可能会有少量消息丢失,单台机器重启或宕机期间,该机器下未被消费的消息在机器恢复前不可订阅,影响消息实时性。

  3、异步多Master多Slave

  每个Master配一个Slave,有多对Master-Slave,集群采用异步复制方式,主备有短暂消息延迟,毫秒级。

  优点:性能同多Master几乎一样,实时性高,主备间切换对应用透明,不需人工干预。
  缺点:Master宕机或磁盘损坏时会有少量消息丢失。

  4、同步多Master多Slave

  每个Master配一个Slave,有多对Master-Slave,集群采用同步双写方式,主备都写成功,向应用返回成功。

  优点:服务可用性与数据可用性非常高。
  缺点:性能比异步集群略低,当前版本主宕备不能自动切换为主。

四、RocketMQ架构

  首先我们来看看RocketMQ架构是怎样的:

     

  接下来看看各个组件如何启动: 

      

  最后看看各个组件如何协作:

      

 五、RocketMQ安装部署

  1、单机部署

  首先我们来尝试进行单机部署,本实例是在Mac环境下进行部署,Linux机器大致一致。

  1.1、官方推荐环境

  • 64bit OS, Linux/Unix/Mac is recommended;(Windows user see guide below)
  • 64bit JDK 1.8+;
  • Maven 3.2.x;
  • Git;
  • 4g+ free disk for Broker server

  1.2、软件包获取

  软件包可以下载源文件进行编译然后安装,也可以直接下载二进制包进行解压安装,本文就以二进制包的安装为例,版本:rocketmq-all-4.7.0-bin-release.zip

  下载地址为:http://rocketmq.apache.org/docs/quick-start/

  中文的GitHub地址:https://github.com/apache/rocketmq/tree/master/docs/cn

  1.3、JDK环境

  本文JDK版本选择 1.8:

HoudeMacBook-Pro:~ ******$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

  注意选择新的版本启动可能出现以下问题:

Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Unrecognized VM option 'UseCMSCompactAtFullCollection'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

  1.4、rocketmq服务端安装

  解压安装包:rocketmq-all-4.7.0-bin-release.zip

unzip rocketmq-all-4.7.0-bin-release.zip

  配置rocketmq的环境变量,在 ~/.bash_profile 最后加入:

export ROCKETMQ_HOME=/Volumes/work/rocketmq-all-4.7.0-bin-release
export PATH=$PATH::$ROCKETMQ_HOME/bin

  然后执行source命令使配置文件生效:

source ~/.bash_profile

  给下列命令可运行权限:

HoudeMacBook-Pro:~ houjing$ cd $ROCKETMQ_HOME/bin
HoudeMacBook-Pro:bin houjing$ pwd
/Volumes/work/rocketmq-all-4.7.0-bin-release/bin
HoudeMacBook-Pro:bin houjing$ chmod +x mqadmin mqbroker mqfiltersrv mqshutdown  mqnamesrv

  新建日志目录:

HoudeMacBook-Pro:~ ******$ cd $ROCKETMQ_HOME
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release ******$ mkdir logs

  1.5、启动namesever

HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ nohup mqnamesrv 1>/Volumes/work/rocketmq-all-4.7.0-bin-release/logs/ng.log 2>/Volumes/work/rocketmq-all-4.7.0-bin-release/logs/ng-err.log &
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ ps -ef|grep rocket
  501  3464  3224   0  8:54下午 ttys000    0:00.02 /bin/sh /Volumes/work/rocketmq-all-4.7.0-bin-release/bin/mqnamesrv
  501  3465  3464   0  8:54下午 ttys000    0:00.01 sh /Volumes/work/rocketmq-all-4.7.0-bin-release/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup
  501  3495  3465   0  8:54下午 ttys000    0:02.88 /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC -verbose:gc -Xloggc:/Volumes/RAMDisk/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:-UseLargePages -Djava.ext.dirs=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/ext:/Volumes/work/rocketmq-all-4.7.0-bin-release/bin/../lib -cp .:/Volumes/work/rocketmq-all-4.7.0-bin-release/bin/../conf:/lib/tools.jar:/lib/dt.jar org.apache.rocketmq.namesrv.NamesrvStartup

  通过日志检查是否启动成功:

HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ tail -f /Volumes/work/rocketmq-all-4.7.0-bin-release/logs/ng.log
Create RAMDisk /Volumes/RAMDisk for gc logging on Darwin OS.
The Name Server boot success. serializeType=JSON

  1.6、启动broker

  启动broker,在启动borker之前须要指定nameserver地址。例如本地单机部署 127.0.0.1 为所在服务器IP:

HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ export NAMESRV_ADDR=127.0.0.1:9876
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ nohup mqbroker >/Volumes/work/rocketmq-all-4.7.0-bin-release/logs/mq.log &
[2] 3584
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ tail -f /Volumes/work/rocketmq-all-4.7.0-bin-release/logs/mq.log
The broker[HoudeMacBook-Pro.local, 192.168.100.28:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876

  1.7、模拟生产者生产

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ export NAMESRV_ADDR=127.0.0.1:9876
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
21:14:59.611 [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.
SendResult [sendStatus=SEND_OK, msgId=C0A8641C0E694D7E188675DB340D0000, offsetMsgId=C0A8641C00002A9F000000000002BEB2, messageQueue=MessageQueue [topic=TopicTest, brokerName=HoudeMacBook-Pro.local, queueId=1], queueOffset=250]
SendResult [sendStatus=SEND_OK, msgId=C0A8641C0E694D7E188675DB34320001, offsetMsgId=C0A8641C00002A9F000000000002BF64, messageQueue=MessageQueue [topic=TopicTest, brokerName=HoudeMacBook-Pro.local, queueId=2], queueOffset=250]
SendResult [sendStatus=SEND_OK, msgId=C0A8641C0E694D7E188675DB34350002, offsetMsgId=C0A8641C00002A9F000000000002C016, messageQueue=MessageQueue [topic=TopicTest, brokerName=HoudeMacBook-Pro.local, queueId=3], queueOffset=250]

  1.8、模拟消费者进行消费

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
21:16:28.569 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
Consumer Started.
ConsumeMessageThread_4 Receive New Messages: [MessageExt [brokerName=HoudeMacBook-Pro.local, queueId=1, storeSize=178, queueOffset=251, sysFlag=0, bornTimestamp=1592918100028, bornHost=/192.168.100.28:58376, storeTimestamp=1592918100029, storeHost=/192.168.100.28:10911, msgId=C0A8641C00002A9F000000000002C17A, commitLogOffset=180602, bodyCRC=601994070, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=500, CONSUME_START_TIME=1592918188998, UNIQ_KEY=C0A8641C0E694D7E188675DB343C0004, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 52], transactionId='null'}]] 
ConsumeMessageThread_10 Receive New Messages: [MessageExt [brokerName=HoudeMacBook-Pro.local, queueId=1, storeSize=179, queueOffset=254, sysFlag=0, bornTimestamp=1592918100065, bornHost=/192.168.100.28:58376, storeTimestamp=1592918100066, storeHost=/192.168.100.28:10911, msgId=C0A8641C00002A9F000000000002C9D8, commitLogOffset=182744, bodyCRC=1659149091, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=500, CONSUME_START_TIME=1592918188998, UNIQ_KEY=C0A8641C0E694D7E188675DB34600010, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 49, 54], transactionId='null'}]] 

  1.9、关闭RockectMQ

mqshutdown namesrv       #关闭nameserver
mqshutdown broker          #关闭broker
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ mqshutdown namesrv
The mqnamesrv(3582) is running...
Send shutdown request to mqnamesrv(3582) OK
HoudeMacBook-Pro:rocketmq-all-4.7.0-bin-release houjing$ mqshutdown broker
The mqbroker(3589) is running...
Send shutdown request to mqbroker(3589) OK

  2、集群部署

  RocketMQ的多Master多Slave模式有两种:异步复制和同步双写。

  异步复制:每个 Master 配置一个 Slave,有多对Master-Slave, HA采用异步复制方式,主备有短暂消息延迟,毫秒级。

      优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master 宕机后,消费者仍然可以从 Slave消费,此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。

      缺点: Master 宕机,磁盘损坏情况,会丢失少量消息。

  同步双写:每个 Master 配置一个 Slave,有多对Master-Slave, HA采用同步双写方式,主备都写成功,向应用返回成功。

      优点:数据与服务都无单点, Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。

      缺点:性能比异步复制模式略低,大约低10%左右,发送单个消息的 RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

  我们首先来部署一个异步复制的RocketMQ,在RocketMQ路径下有两个文件夹:
drwxr-xr-x   6 houjing  admin    192  3  4 09:59 2m-2s-async/
drwxr-xr-x   6 houjing  admin    192  3  4 09:59 2m-2s-sync/

  分别用于异步复制和同步双写配置,我们进入到目录2m-2s-sync,可以看到4个broker文件,表示2Master2Slave的RocketMQ集群。

-rw-r--r--   1 houjing  admin  922  3  4 09:59 broker-a-s.properties
-rw-r--r--   1 houjing  admin  928  3  4 09:59 broker-a.properties
-rw-r--r--   1 houjing  admin  922  3  4 09:59 broker-b-s.properties
-rw-r--r--   1 houjing  admin  928  3  4 09:59 broker-b.properties
192:2m-2s-sync houjing$ pwd
/Volumes/work/rocketmq-all-4.7.0-bin-release/conf/2m-2s-sync

  我们依次对4个properties进行配置配置:

#mq-master01节点配置/data/rocketmq/conf/2m-2s-sync/broker-a.properties
[root@mq-master01 ~]# vim /data/rocketmq/conf/2m-2s-sync/broker-a.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样  例如:在a.properties 文件中写 broker-a  在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.10.207:9876;
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数。由于是4个broker节点,所以设置为4
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=MASTER                       #要配置为MASTER或SLAVE的角色
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
 
#mq-master02节点配置的是/data/rocketmq/conf/2m-2s-sync/broker-b.properties      #就下面三行配置不一样,其他配置行都一样!
[root@mq-master02 software]# vim /data/rocketmq/conf/2m-2s-sync/broker-b.properties     
......
brokerName=broker-b           
brokerId=0
brokerRole=MASTER  
 
#mq-slave01节点配置的是/data/rocketmq/conf/2m-2s-sync/broker-a-s.properties
[root@mq-slave01 software]# vim /data/rocketmq/conf/2m-2s-sync/broker-a-s.properties
......
brokerName=broker-a          #注意这一行的名称要和master保持一致
brokerId=1                   #这个ID要跟master的不一致!
brokerRole=SLAVE             #要配置为从
 
#mq-slave02节点配置的是/data/rocketmq/conf/2m-2s-sync/broker-b-s.properties
[root@mq-slave02 software]# vim /data/rocketmq/conf/2m-2s-sync/broker-b-s.properties
......
brokerName=broker-b         #注意这一行的名称要和master的保持一致
brokerId=1                  #这个ID要跟master的不一致
brokerRole=SLAVE            #要配置为从

  注意要创建存储&日志文件,如果一台虚拟机部署多个需要用文件进行区分。

  修改日志配置文件,如:

mkdir -p /root/svr/rocketmq/logs
cd /root/svr/rocketmq/conf && sed -i 's#${user.home}#/root/svr/rocketmq#g'*.xml

  注意logback.*.xml配置文件中${user.home}需要替换自己指定的目录

  同时要进行默认参数修改,runbroker.sh,runserver.sh启动参数默认对jvm的堆内存设置比较大(不改启动不起来),如果是虚拟机非线上环境需要改下参数,大小可以根据自己机器来决定
默认大小:

-Xms8g -Xmx8g -Xmn4g
改为:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"

  配置完成后跟单机部署一样先启动NameServer,然后启动Broker即可。附RocketMQ常用命令:

需要切换到bin目录下,即:
[root@mq-master01 ~]# cd /data/rocketmq/bin
[root@mq-master01 bin]#
 
获取所有可用命令:
[root@mq-master01 bin]# sh mqadmin
 
查看帮助:
# sh mqadmin <command> -h
查询Producer的网络连接情况:
# sh mqadmin producerConnection -n localhost:9876 -g <producer-group> -t <producer-topic>
查询Consumer的网络连接情况:
# sh mqadmin consumerConnection -n localhost:9876 -g <consumer-group>
查询Consumer的消费状态:
# sh mqadmin consumerProgress -n localhost:9876 -g <consumer-group>
 
查询消息是否发送成功
获取指定Topic:
# sh mqadmin topicList -n localhost:9876 | grep <topicName>
查看Topic状态:
# sh mqadmin topicStatus -n localhost:9876 -t <topicName>
根据offset获取消息:
# sh sh mqadmin queryMsgByOffset -n localhost:9876 -b <broker-name> -i <queueId> -o <offset> -t <topicName>
根据offsetMsgId查询消息:
# sh sh mqadmin queryMsgById -n localhost:9876 -i <offsetMsgId>
 
查询消息是否被消费成功
查询消息详情:
# sh mqadmin queryMsgById -i {MsgId} -n {NameServerAddr}
查看Consumer Group订阅了哪些TOPIC:
# sh mqadmin consumerProgress -g <ConsumerGroup> -n <NameServerAddr>
 
查询TOPIC被哪些Consumer Group订阅了
没有查询特定TOPIC订阅情况,只能查询所有后再过滤:
# sh mqadmin statsAll -n <NameServerAddr> | grep <TOPIC>
返回结果:#Topic #Consumer Group #InTPS #OutTPS #InMsg24Hour #OutMsg24Hour
 
关闭nameserver和所有的broker:
# sh mqshutdown namesrv
# sh mqshutdown broker
 
查看所有消费组group:
# sh mqadmin consumerProgress -n 192.168.23.159:9876
查看指定消费组(kevinGroupConsumer)下的所有topic数据堆积情况:
# sh mqadmin consumerProgress -n 192.168.23.159:9876 -g kevinGroupConsumer
查看所有topic :
# sh mqadmin topicList -n 192.168.23.159:9876
查看topic信息列表详情统计
# sh mqadmin topicstatus -n 192.168.23.159:9876 -t myTopicTest1
新增topic
# sh mqadmin updateTopic –n 10.45.47.168 –c DefaultCluster –t ZTEExample
删除topic
# sh mqadmin deleteTopic –n 10.45.47.168:9876 –c DefaultCluster –t ZTEExample

 五、RocketMQ Console安装部署

   1、rocketmq-console介绍

  RocketMQ-Console是RocketMQ项目的扩展插件,是一个图形化管理控制台,提供Broker集群状态查看,Topic管理,Producer、Consumer状态展示,消息查询等常用功能,这个功能在安装好RocketMQ后需要额外单独安装、运行。

  2、rocketmq-console下载、部署

  进入rocketmq-externals项目的GitHub地址,如下图,可看到RocketMQ项目的诸多扩展项目,其中就包含我们需要下载的rocketmq-console。

   

  

// 克隆项目到本地
git clone  https://github.com/apache/rocketmq-externals.git

  3、进入项目文件夹并修改配置文件

  中文注释是为了方便解释,请删除,不然打包报错:Not allow chinese character !

// 进入目录
$ cd rocketmq-externals/rocketmq-console/
// 修改maven项目的资源文件
$ vim src/main/resources/application.properties 
#管理后台访问上下文路径,默认为空,如果填写,一定要前面加“/”,后面不要加,否则启动报错
server.contextPath=/rocketmq
#访问端口
server.port=8080

### SSL setting  默认就行
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey

#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
#logback配置文件路径,先默认即可
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
#Name Server地址,修改成你自己的服务地址。多个地址用英文分号“;”隔开
rocketmq.config.namesrvAddr=localhost:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket

#Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=false

  注意: Name Server地址默认为空,可以在启动项目后在后台配置;或者启动服务的时候给出rocketmq.config.namesrvAddr参数值。

  4、将项目打成jar包,并运行jar文件

$ mvn clean package -Dmaven.test.skip=true
$ java -jar target/rocketmq-console-ng-1.0.0.jar
#如果配置文件没有填写Name Server的话,可以在启动项目时指定namesrvAddr
$ java -jar target/rocketmq-console-ng-1.0.0.jar --rocketmq.config.namesrvAddr='localhost:9876'

#因为本文在打包时配置了namesrvAddr,故而执行如下命令
$ java -jar target/rocketmq-console-ng-1.0.0.jar

  5、IDEA上直接运行Console

   我们也可以直接在IntelliJ上启动Console,console插件本身就是一个项目,可以直接在IDEA导入项目并运行,同上进行application.properties修改,然后找到app启动类启动,如下图所示:

    

六、Console控制台的使用 

  浏览器访问如下:

  

  如上图所示,DashBoard展示了一些Broker和Topic的基本信息。

  1、NameSrvAdd配置

   

  NameServer除了可以在首次启动时在Application.properties中指定,还可以在Console启动后进行配置。

  2、集群Cluster

   

  3、 Topic主题

  主题可在此处进行增删查改,其中TopicTest是我们RocketMQ的默认主题。

  

  3.1、添加Topic

  我们可以进行手动添加:

   

  3.2、Topic状态

  RocketMQ自带的默认Topic:TopicTest,默认有四个队列。

  

  3.3、发送消息

  

   4、消息Message

  

posted on 2020-07-20 16:09  kosamino  阅读(3849)  评论(0编辑  收藏  举报