RocketMQ 主题(Topic)管理

Topic 是 RocketMQ 中消息传输和存储的顶层容器,用于表示同一类业务逻辑的消息。比如:我们将通知类消息和业务类消息进行隔离,就可以使用不同的主题。也可以通过主题的分隔来做身份识别和鉴权等。

RocketMQ 5.x 版本开始,不建议使用自动添加主题,主题作为 RocketMQ 的顶层容器,需要严格合理的创建与管理,而且主题的创建与管理会占用一定的系统资源,所以特别是在生产环境下增删改查都不要随意进行。

5.1.3 版本的 RocketMQ目前是开启字段添加主题的,可以配置 borker 参数 autoCreateTopicEnable 为 false 来禁用。关于如何配置,我们会在后续文章中说明。

消息类型

RocketMQ 支持的主题消息类型如下:

  1. Normal:普通消息,消息本身无特殊语义,消息之间也没有任何关联。
  2. FIFO:顺序消息,RocketMQ 通过消息分组Mes ageGroup 标记一组特定消息的先后顺序,可以保证消息的投递顺序严格按照消息发送时的顺序。
  3. Delay:定时/延时消息,通过指定延时时间控制消息生产后不要立即投递,而是在延时间隔后才对消费者可见。
  4. Transaction:事务消息,RocketMQ 支持分布式事务消息,支持应用数据库更新和消息调用的事务一致性保障。

消息位点(Offset)

消息是按到达服务端的先后顺序存储在指定主题的多个队列中,每条消息在队列中都有一个唯一的Long类型坐标,这个坐标被定义为消息位点。

队列中最早一条消息的位点为最小消息位点(MinOffset);最新一条消息的位点为最大消息位点(MaxOffset)。

通过主题、队列和位点就可以定位任意一条消息的位置。
在这里插入图片描述
虽然消息队列逻辑上是无限存储,但由于服务端物理节点的存储空间有限, RocketMQ 会滚动删除队列中存储最早的消息。因此,消息的最小消费位点和最大消费位点会一直递增变化。
在这里插入图片描述

消费位点(ConsumerOffset)

RocketMQ 通过消费位点管理消息的消费进度。每条消息被某个消费者消费完成后不会立即在队列中删除,RocketMQ 会基于每个消费者分组维护一份消费记录,该记录指定消费者分组消费某一个队列时,消费过的最新一条消息的位点,即消费位点。

队列中消息位点MinOffset、MaxOffset和每个消费者分组的消费位点ConsumerOffset的关系如下:
在这里插入图片描述

  • ConsumerOffset≤MaxOffset:
    • 当消费速度和生产速度一致,且全部消息都处理完成时,最大消息位点和消费位点相同,即ConsumerOffset=MaxOffset。
    • 当消费速度较慢小于生产速度时,队列中会有部分消息未消费,此时消费位点小于最大消息位点,即ConsumerOffset<MaxOffset,两者之差就是该队列中堆积的消息量。
  • ConsumerOffset≥MinOffset:正常情况下有效的消费位点ConsumerOffset必然大于等于最小消息位点MinOffset。消费位点小于最小消息位点时是无效的,相当于消费者要消费的消息已经从队列中删除了,是无法消费到的,此时服务端会将消费位点强制纠正到合法的消息位点。

消费点位的初始值

RocketMQ 定义消费位点的初始值为消费者首次获取消息时,该时刻队列中的最大消息位点。相当于消费者将从队列中最新的消息开始消费。消费点位保存在服务端,与消费者无关(这样可以支持跨消费者的消费恢复)

在实际应用中,我们可能重置消费点位,以跳过某些消息不消费,或者恢复已消费的消息,这个我们后面再讲。

使用 mqadmin 命令工具管理主题

mqadmin 命令工具可以管理主题、集群、borker、消息、NameServer 等

mqadmin 工具使用注意事项

  1. 执⾏命令⽅法:./mqadmin {command} {args}
  2. ⼏乎所有 {command} 命令都需要配置 -n 表⽰ NameServer 地址,格式为 ip:port
  3. ⼏乎所有 {command} 命令都可以通过 -h 获取帮助。官方文档提示在执行命令前使用 -h 查看一下命令的选项,避免由于文档更新不及时造成的命令执行错误。
  4. 如果既有 Broker 地址(-b)配置项又有 clusterName(-c)配置项,则优先以 Broker 地址执⾏命令,如果不配置 Broker 地址,则对集群中所有主机执⾏命令,只⽀持⼀个 Broker 地址。-b 格式为 ip:port,port 默认是 10911

几乎所有的 mqadmin 命令都有 -n 和 -c 命令

updateTopic 创建或更新主题

查看命令帮助

$> ./mqadmin updateTopic -h

结果

usage: mqadmin updateTopic [-a <arg>] -b <arg> | -c <arg>  [-h] [-n <arg>] [-o <arg>] [-p <arg>] [-r <arg>]
       [-s <arg>] -t <arg> [-u <arg>] [-w <arg>]
 -a,--attributes <arg>       attribute(+a=b,+c=d,-e) # Topic 的属性,如 message.type 消息的类型
 -b,--brokerAddr <arg>       create topic to which broker # broker 地址
 -c,--clusterName <arg>      create topic to which cluster # 集群名称,默认集群名称为:DefaultCluster 
 -h,--help                   Print help # 帮助选项
 -n,--namesrvAddr <arg>      Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876' # nameServer 地址
 -o,--order <arg>            set topic's order(true|false) # 是否为顺序消息主题,此设置需要与 message.type 消息的类型对应
 -p,--perm <arg>             set topic's permission(2|4|6), intro[2:W 4:R; 6:RW; 0:不可读写] # 指定新topic的读写权限( W=2|R=4|WR=6)
 -r,--readQueueNums <arg>    set read queue nums # 可读队列大小(默认为8),
 -s,--hasUnitSub <arg>       has unit sub (true|false) 
 -t,--topic <arg>            topic name # 主题名称
 -u,--unit <arg>             is unit topic (true|false)
 -w,--writeQueueNums <arg>   set write queue nums # 可写队列大小(默认为8)

-r 和 -w 是读写队列的大小,队列数量的设置应遵循少用够用原则,避免随意增加队列数量。

-s 和 -u 官方文档没有说明,查看 tools 源码后,其对应的代码如下:
在这里插入图片描述
最后找到的解释为 sysFlag 是 Topic 的系统标志,

添加主题示例

$> ./mqadmin updatetopic -n localhost:9876 -c DefaultCluster -t TestTopic -a +message.type=NORMAL

执行结果

TopicConfig [topicName=TestTopic, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false, attributes={+message.type=NORMAL}]

注:Topic命名应该尽量使用简短、常用的字符,避免使用特殊字符。特殊字符会导致系统解析出现异常,字符过长可能会导致消息收发被拒绝,最好对主题的命名制定相应的规则规范,避免滥用导致主题的管理上的混乱。

topicList 查询主题列表

$> ./mqadmin topicList -n localhost:9876 -c DefaultCluster 

deleteTopic 删除主题

查看命令选项

$> ./mqadmin deleteTopic -h
usage: mqadmin deleteTopic -c <arg> [-h] [-n <arg>] -t <arg>
 -c,--clusterName <arg>   delete topic from which cluster
 -h,--help                Print help
 -n,--namesrvAddr <arg>   Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876'
 -t,--topic <arg>         topic name

示例

$> ./mqadmin deleteTopic -n localhost:9876 -c DefaultCluster -t TestTopic
delete topic [TestTopic] from cluster [DefaultCluster] success.
delete topic [TestTopic] from NameServer success.

topicStatus 查看消息位点信息

查看命令选项

$> ./mqadmin topicStatus -h
usage: mqadmin topicStatus [-h] [-n <arg>] -t <arg>
 -h,--help                Print help
 -n,--namesrvAddr <arg>   Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876'
 -t,--topic <arg>         topic name

示例

$> ./mqadmin topicStatus -n localhost:9876 -t TestTopic
#Broker Name                      #QID  #Min Offset           #Max Offset             #Last Updated
broker-a                          0     0                     0
broker-a                          1     0                     0
broker-a                          2     0                     0
broker-a                          3     0                     0
broker-a                          4     0                     0
broker-a                          5     0                     0
broker-a                          6     0                     0
broker-a                          7     0                     0
  • Broker Name:Broker 的名称
  • QID:主题中的队列id(上面说过,主题中默认8个队列)
  • Min offset:最小消息位点
  • Max offset:最大消息位点,跟当队列收到的消息数量相关
  • Last Updated:当前队列最后一次修改的时间

topicRoute 查询主题路由信息

查看命令选项

$> ./mqadmin topicRoute -h
usage: mqadmin topicRoute [-h] [-l] [-n <arg>] -t <arg>
 -h,--help                Print help
 -l,--list                Use list format to print data
 -n,--namesrvAddr <arg>   Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876'
 -t,--topic <arg>         topic name

示例

$> ./mqadmin topicRoute -n localhost:9876 -t TestTopic
{
        "brokerDatas":[
                {
                        "brokerAddrs":{0:"192.168.1.1:10911"
                        },
                        "brokerName":"broker-a",
                        "cluster":"DefaultCluster",
                        "enableActingMaster":false
                }
        ],
        "filterServerTable":{},
        "queueDatas":[
                {
                        "brokerName":"broker-a",
                        "perm":6,
                        "readQueueNums":8,
                        "topicSysFlag":0,
                        "writeQueueNums":8
                }
        ]
}
$> ./mqadmin topicRoute -n localhost:9876 -t TestTopic -l
#ClusterName                                  #BrokerName                      #BrokerAddrs                                       #ReadQueue #WriteQueue #Perm
DefaultCluster                                broker-a                         {0=192.168.1.1:10911}                           8          8           6
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Total:                                        1                                                                                   8          8

topicClusterList 查看主题所在集群列表

查看命令选项

$> ./mqadmin topicClusterList -h
usage: mqadmin topicClusterList [-h] [-n <arg>] -t <arg>
 -h,--help                Print help
 -n,--namesrvAddr <arg>   Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876'
 -t,--topic <arg>         topic name

示例

$> ./mqadmin topicClusterList -n localhost:9876 -t TestTopic
DefaultCluster

updateTopicPerm 修改主题读写权限

查看命令选项

$> ./mqadmin updateTopicPerm -h
usage: mqadmin updateTopicPerm [-b <arg>] [-c <arg>] [-h] [-n <arg>] -p <arg> -t <arg>
 -b,--brokerAddr <arg>    create topic to which broker
 -c,--clusterName <arg>   create topic to which cluster
 -h,--help                Print help
 -n,--namesrvAddr <arg>   Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876'
 -p,--perm <arg>          set topic's permission(2|4|6), intro[2:W; 4:R; 6:RW]
 -t,--topic <arg>         topic name

示例

$> ./mqadmin updateTopicPerm -n localhost:9876 -c DefaultCluster -t TestTopic -p 6
update topic perm from 6 to 6 in 192.168.1.1:10911 success.

注意:此处 -c 参数为必须(同 updateTopic 命令)

allocateMQ 查看对应IP的负载信息

查看命令选项

$> ./mqadmin allocateMQ -h
usage: mqadmin allocateMQ [-h] -i <arg> [-n <arg>] -t <arg>
 -h,--help                Print help
 -i,--ipList <arg>        ipList
 -n,--namesrvAddr <arg>   Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876'
 -t,--topic <arg>         topic name

示例

$> ./mqadmin allocateMQ -n localhost:9876 -t TestTopic -i 192.168.1.1
{"result":{"192.168.1.1":[{"brokerName":"broker-a","queueId":2,"topic":"TestTopic"},{"brokerName":"broker-a","queueId":3,"topic":"TestTopic"},{"brokerName":"broker-a","queueId":4,"topic":"TestTopic"},{"brokerName":"broker-a","queueId":5,"topic":"TestTopic"},{"brokerName":"broker-a","queueId":6,"topic":"TestTopic"},{"brokerName":"broker-a","queueId":7,"topic":"TestTopic"},{"brokerName":"broker-a","queueId":0,"topic":"TestTopic"},{"brokerName":"broker-a","queueId":1,"topic":"TestTopic"}]}}

statsAll 查看主题相关TPS信息

查看命令选项

$> ./mqadmin statsAll -h
usage: mqadmin statsAll [-a] [-h] [-n <arg>] [-t <arg>]
 -a,--activeTopic         print active topic only
 -h,--help                Print help
 -n,--namesrvAddr <arg>   Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876'
 -t,--topic <arg>         print select topic only

示例

$> ./mqadmin statsAll -n localhost:9876 -t TestTopic
#Topic                                                            #Consumer Group                                                  #Accumulation      #InTPS     #OutTPS   #InMsg24Hour  #OutMsg24Hour
TestTopic                                                         YourConsumerGroup                                                           1      140.48      140.47         605272         605270

不使用 -t 参数的话,将会显示所有主题的情况

  • Topic:主题名称
  • Consumer Group:消费组
  • Accumulation:当前的累积量(一般情况下值应该很小,如果值很大说明消费能力不足,需要查看消费者的情况)
  • InTPS:写入的TPS
  • OutTPS:消费的TPS
  • InMsg24Hour :24小时内进入的消息量
  • OutMsg24Hour:24小时内消费的消息量

将消费者停掉,用生产者发送几条消息,当前的积累量就会出现了。

消息堆积

生产者已经将消息发送到 RocketMQ 的服务端,但由于消费者的消费能力有限,未能在短时间内将所有消息正确消费掉,此时在服务端保存着未被消费的消息,该状态即消息堆积。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值