【Java劝退师】RocketMQ 知识脑图 - 分布式消息中间件

731 阅读24分钟

RocketMQ

RocketMQ

分布式消息中间件

一、应用场景

  1. 系统解偶 - 主要流程与次要流程分离 - 系统耦合性越高,容错性越低
  2. 流量削峰 - 将大量请求缓存,分散到长时间处理
  3. 数据分发 - 让数据在多个系统间流通

二、角色

1. Producer 消息生产者

  • 随机选择一个 NameServer 进行长连接,获取 Topic 路由消息
  • 与提供 Topic 服务的 Master 创建长连接,并发送心跳
  • 发生错误的 Broker,5分钟内不会参加队列负载
  • ProducerGroup - 当事务消息的生产者崩溃,则由组内其它生产者运行提交或回滚 - 默认名称 DEFAULT

2. Consumer 消息消费者

  • 随机选择一个 NameServer 进行长连接,获取 Topic 路由消息

  • 与提供 Topic 服务的 Master、Slave 创建长连接,并发送心跳

  • 当读取 偏移量 与 最大偏移量 差距过大,则从 Slave 读取

  • 当 Master 不可用或繁忙,将自动切换到 Slave 读取

  • 若数量超过 Message Queue,将有部分消费者收不到消息

  • ConsumerGroup - 订阅完全相同的 Topic

类型

  • PushConsumer - Broker 主动推送消息

  • PullConsumer - 消费者拉取消息

3. Broker 消息暂存中心

  • BrokerId 为 0 - Master

  • BrokerId 非 0 - Slave,只有为 1 才会进行读负载

  • 不支持将 Slave 自动转成 Master

  • BrokerName 相同 - 一组 Broker ( 1个 Master,多个 Slave )

  • 与【所有】NameServer 创建长连接,定时发送心跳包,心跳包包含 Broker 的 IP&端口、Topic 信息

消息复制方式

  • 同步复制 - Master、Slave 均写成功,才返回成功状态

  • 异步复制 - Master 写成功,即返回成功状态 - Master故障,消息可能丢失

消息刷盘方式

  • 同步刷盘

  • 异步刷盘 - 写入 PageCache 就返回

【建议】同步复制,异步刷盘

4. NameServer Broker管理者

保存所有 Broker、Topic、Filter (Tags、SQL92) 信息

  • 无状态节点,节点间无数据同步
  • 不主动推送消息
  • 与所有 Broker 进行注册
  • 每隔 10 秒扫描存活的 Broker 连接,超时 2 分钟则断开
  • 占用资源不多,可与 Broker 布署在同一台机器
  • 不直接使用 Zookeeper 作为 NameServer 原因
    • Zookeeper 是 CP 模式,而注册中心应该偏向 AP 模式
    • 当 Zookeeper 服务规模超过一定数量,性能堪忧 - 服务注册、健康检测压力大
    • 注册中心不关心历史信息,只关心当前状态,而 Zookeeper 着重于数据持久化
    • Zookeeper 主要用于 分布式锁、分布式选主、主备切换 ... 等,不需要高 TPS 场景,主要在大数据、脱机任务上

5. Topic 主题

  • 创建时需决定要存放在哪些 Broker 上
  • 一个应用尽可能只使用一个 Topic,子类型透过 tags 标示
  • 重试 Topic - %RETRY%消费组名称
  • 死信 Topic - %DLQ%消费组名称

6. MessageQueue 主题分区

  • 推荐将数量设为 16
  • 只能被一个消费者消费,一个消费者可以消费多个主题分区

7. Tag 标签

  • 区分同一主题下,不同类型的消息

8. Message 消息

  • Topic 主题

  • Body 消息体

  • Tags 消息标签

  • Keys 消息关键词

  • Flags 额外消息

  • DelayTimeLevel 消息延迟级别

  • WaitStoreMsgOK 是否在消息落盘后才回应

可视化工具

github.com/apache/rock…

三、生产者消息发送

模式

1. 广播模式

  • 一条消息被多个 Consumer 消费,即使这些消费者处于同一个 Consumer Group (Consumer Group 无意义)

2. 集群模式

  • Consumer Group 中的 Consumer 平均分摊消息 - 消息只被 1 个 Consumer 接收

方式

  • 同步发送 - 重试 2 次 - 发送失败则轮转到下一个 Broker

  • 异步发送 - 重试 0 次

  • Oneway - 重试 0 次 - 只将消息放到生产者 Socket 缓冲区就返回 - 微秒级别

返回状态

  • SEND_OK : 发送成功

  • FLUSH_DISK_TIMEOUT : 开启同步刷盘策略,但没有在规定时间内完成刷盘 - 默认 5 秒

  • FLUSH_SLAVE_TIMEOUT : 开启主从同步,但在规定时间内未完成 - 默认 5 秒

  • SLAVE_NOT_AVAILABLE : 开启主从同步,但未找到 SLAVE

延迟消息

等待时间投递给真正的 Topic

有 18 个等级,为 1秒 ~ 2小时

原理 : 利用多个 MessageQueue 实现

四、消费者消息消费

模式

1. Push 推模式

本质上也是拉模式,透过 Consumer 轮循拉取

  • 相当于监听器
  • 实时性高
  • 使用长轮循来仿真 Push 效果,避免因消息积压压垮客户端

2. Pull 拉模式

  • 缺点 - 难调整拉取频率

消费顺序

1. 普通消息顺序

  • 允许 Broker 当机重启时,消息短暂混乱

2. 严格消息顺序

  • 异常情况下(Broker 当机重启)时,也需保证消息有序 - 损失高可用 : 单台 Master 当机,将无法发送消息

保证全局消息顺序

  1. Topic 的 MessageQueue 数量设为 1
  2. 消费端使用 MessageListenerOrderly - 保证单个 MessageQueue 中可以顺序消费
  3. setConsumeThreadMin 、setConsumeThreadMax 设为 1 - 并发数
  4. setPullBatchSize 设为 1 - 单次 Pull 消息最大数量
  5. setConsumeMessageBatchMaxSize 设为 1 - 单次 Push 消息数量

消费点位

  • CONSUME_FROM_LAST_OFFSET - 忽略历史消息
  • CONSUME_FROM_FIRST_OFFSET - 消费每个存在于 Broker 的消息
  • CONSUME_FROM_TIMESTAMP - 消费指定时间戳后的消息

五、Broker 存储结构

  1. ConsumeQueue - 逻辑队列,消息的索引文档

    • 内容

      • CommitLog 中消息的偏移量 - 8字节
      • 消息大小 - 4字节
      • 消息 Tag 的 Hash 值 - 8字节
    • 保存 30 万条索引纪录,约 5.72 MB

  2. CommitLog - 消息存储文档

    • 默认大小 1G

    • 文档名为偏移量,长度 20 位

  3. IndexFile - 时间戳索引文档

    • 文档名为时间戳
    • 保存 2000 万条索引纪录,约 400 MB

六、消息过滤

Tag 过滤

  • Broker 端仅针对 Tag 的 Hash 值进行过滤
  • Consumer 端 针对原始 Tag 值再进行比对

SQL92 过滤

支持复杂逻辑过滤

  • 数字 : >, >=, <, <=, BETWEEN, =

  • 字符串 : =, <>, IN, ISNULL, IS NOT NULL

  • 逻辑 : AND, OR, NOT

七、负载均衡

负载均衡皆在 Client 端完成

1. Publisher 生产者

  • 轮循 MessageQueue 方式发送消息【默认】

2. Consumer 消费者

分配 Consumer 从哪些 MessageQueue 中读取消息

启动、有新 Consumer 加入到 ConsumerGroup 中时,将自动平衡

  • 默认采用 AllocateMessageQueueAveragely 策略

八、消费者消息重试

1. 普通消息顺序

  • 默认重试 16 次,重试时间依次递增(10秒~2小时) - 只针对集群消费模式有效,广播模式不提供失败重试特性

  • 最大重试次数设置作用范围为 Consumer Group,后启动的 Consumer 会覆盖之前的配置

2. 严格消息顺序

  • 消费失败时,每隔 1 秒不断重试,如不能及时处理,将导致阻塞

3. 返回状态

异常

  • 返回 ConsumeConcurrentlyStatus.RECONSUME_LATER - 无序
  • 返回 ConsumeConcurrentlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT - 有序

正常

  • 返回 ConsumeConcurrentlyStatus.CONSUME_SUCCESS

九、死信队列

消费者消费达到最大重试次数,仍然消费失败,则将消息放入死信队列

  • 消息有效期为 3 天,3 天后自动删除

  • 一个死信队列对应一个 Consumer Group ID,而非 Topic

  • 如果一个 Consumer Group ID 未产生死信消息,则 RocketMQ 不会为其创建

十、消息事务

消息发送事件 与 本地事务 同时成功或同时失败

原理 : 2PC 两阶段提交

运行原理

  1. Producer 发送 half 消息到 RMQ_SYS_TRANS_HALF_TOPIC 主题
  2. 当要进行 Commit 或 Rollback 时,发送一个 op 消息,将 half 消息标记为确定状态 - 未确定消息默认回查15次,默认回滚
  3. 当是进行 Commit 时,取出 op 消息中的 half 消息位置,为 half 消息创建索引
  4. 创建 half 消息索引后,half 消息可见,即可透过 half 消息恢复出原消息,并将消息存入原来的 Topic

十一、消息优先级

RocketMQ 不支持 Topic 级别的优先级设置,需要自行实现

  1. 某类消息流量大,导致其它类型的消息无法正常消费

    • 将流量大的消息单独制定一个 Topic,其它类型一个 Topic,并创建两个 Consumer 分别消费

    • 将每个类型的消息都制定一个 MessageQueue,DefaultMQPushConsumer 是透过轮循 MessageQueue 进行消费

  2. 强制优先级

    创建多个 Topic,多个 Consumer,自主控制消费时机

十二、流量控制

1. 生产者

Broker 处理能力达到瓶颈,拒绝发送请求,不会重投消息

  • commitLog 被锁时间超过 osPageCacheBusyTimeOutMills - 默认 1000ms
  • 开启 transientStorePoolEnable = true 且 Broker 为异步刷盘,transientStorePool 资源不足
  • Broker 处理请求时间超过 waitTimeMillsInSendQueue - 默认 200ms

2. 消费者

消费能力达到瓶颈,降低拉取频率

  • 本地缓存消息数超过 pullThresholdForQueue - 默认 1000
  • 本地缓存消息大小超过 pullThresholdSizeForQueue - 默认 100 MB
  • 本地缓存消息跨度超过 consumeConcurrentlyMaxSpan - 默认 2000

十三、集群模式

  1. 单 Master

    • Broker 当机,服务不可用,仅用于本地测试

  2. 多 Master

    • 单个 Master 当机期间,该机器上未被消费的消息不可订阅,同步刷盘消息不丢,异步刷盘丢失少量消息

  3. 多 Master 多 Slave (异步)

    • Master 当机,Consumer 仍可从 Slave 消费

    • Master 硬盘损坏,丢失少量消息

  4. 多 Master 多 Slave (同步)

    • 消息不丢失,可用性高,比异步复制性能略低 10%

    • 备机不能自动切换为主机

十四、优化

1. 写入性能

  • 采用 Oneway 方式发送

2. 消费性能

  • 增加 Consumer 实例

  • 增加处理线程数

    • consumeThreadMin

    • consumeThreadMax

  • 批量消费 - consumeMessageBatchMaxSize - 默认 1

  • 跳过非重要消息

十五、配置参数

Broker 配置文档

/opt/rocket/conf/broker.conf

参数名默认值说明
listenPort10911接受客户端连接的监听端口
namesrvAddrnullnameServer 地址
brokerIP1网卡的 InetAddress当前 broker 监听的 IP
brokerIP2跟 brokerIP1 一样存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性, broker 从节点会连接主节点配置的 brokerIP2 进行同步
brokerNamenullbroker 的名称
brokerClusterNameDefaultCluster本 broker 所属的 Cluser 名称
brokerId0broker id, 0 表示 master, 其他的正整数表示 slave
storePathCommitLog$HOME/store/commitlog/存储 commit log 的路径
storePathConsumerQueue$HOME/store/consumequeue/存储 consume queue 的路径
mapedFileSizeCommitLog1024 * 1024 * 1024(1G)commit log 的映射文档大小
deleteWhen04在每天的什么时间删除已经超过文档保 留时间的 commit log
fileReserverdTime72以小时计算的文档保留时间
brokerRoleASYNC_MASTERSYNC_MASTER 或者 ASYNC_MASTER 或者 SLAVE SYNC_MASTER表示当前broker是一个 同步复制的Master ASYNC_MASTER表示当前broker是一个异步复制的Master SLAVE表示当前borker是一个Slave。
flushDiskTypeASYNC_FLUSHSYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保证在 收到确认生产者之前将消息刷盘。 ASYNC_FLUSH 模式下的 broker 则利 用刷盘一组消息的模式,可以取得更好的性能。

客户端通用配置 (Producer、Consumer)

参数名默认值说明
namesrvAddrName Server地址列表,多个NameServer 地址用分号隔开
clientIP本机IP客户端本机IP地址,某些机器会发生无法识别 客户端IP地址情况,需要应用在代码中强制指定
instanceNameDEFAULT客户端实例名称,客户端创建的多个 Producer、Consumer实际是共用一个内部实例(这个实例包含网络连接、线程资源等)
clientCallbackExecutorThreads4通信层异步回调线程数
pollNameServerInteval30000轮询Name Server间隔时间,单位毫秒
heartbeatBrokerInterval30000向Broker发送心跳间隔时间,单位毫秒
persistConsumerOffsetInterval5000持久化Consumer消费进度间隔时间,单位毫秒

Producer 配置

参数名默认值说明
producerGroupDEFAULT_PRODUCERProducer组名,多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组
createTopicKeyTBW102在发送消息时,自动创建服务器不存在的topic,需要指定Key,该 Key可用于配置发送消息所在topic 的默认路由。
defaultTopicQueueNums4在发送消息,自动创建服务器不存在的topic时,默认创建的队列数
sendMsgTimeout10000发送消息超时时间,单位毫秒
compressMsgBodyOverHowmuch4096消息Body超过多大开始压缩 (Consumer收到消息会自动解压 缩),单位字节
retryAnotherBrokerWhenNotStoreOKFALSE如果发送消息返回sendResult,但是sendStatus!=SEND_OK,是否重试发送
retryTimesWhenSendFailed2如果消息发送失败,最大重试次数,该参数只对同步发送模式起作用
maxMessageSize4MB客户端限制的消息大小,超过报错,同时服务端也会限制,所以需要跟服务端配合使用。
transactionCheckListener事务消息回查监听器,如果发送事务消息,必须设置
checkThreadPoolMinSize1Broker回查Producer事务状态时, 线程池最小线程数
checkThreadPoolMaxSize1Broker回查Producer事务状态时, 线程池最大线程数
checkRequestHoldMax2000Broker回查Producer事务状态时, Producer本地缓冲请求队列大小
RPCHooknull该参数是在Producer创建时传入的,包含消息发送前的预处理和消息响应后的处理两个接口,用户可以在第一个接口中做一些安全控制或者其他操作

PushConsumer 配置

参数名默认值说明
consumerGroupDEFAULT_CONSUMERConsumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组
messageModelCLUSTERING消费模型支持集群消费和广播消费两种
consumeFromWhereCONSUME_FROM_LAST_OFFSETConsumer启动后,默认从上次消费的位置开始消费,这包含两种情况:一种是上次消费的位置未过期,则消费从上次中止的位置进行;一种是上次消费位置已经过期,则从当前队列第一条消息开始消费
consumeTimestamp半个小时前只有当consumeFromWhere值为 CONSUME_FROM_TIMESTAMP时才起作用。
allocateMessageQueueStrategyAllocateMessageQueueAveragelyRebalance算法实现策略
subscription订阅关系
messageListener消息监听器
offsetStore消费进度存储
consumeThreadMin10消费线程池最小线程数
consumeThreadMax20消费线程池最大线程数
consumeConcurrentlyMaxSpan2000单队列并行消费允许的最大跨度
pullThresholdForQueue1000拉消息本地队列缓存消息最大数
pullInterval0拉消息间隔,由于是长轮询,所以为0,但是如果应用为了流控,也可以设置大于0的值,单位毫秒
consumeMessageBatchMaxSize1批量消费,一次消费多少条消息
pullBatchSize32批量拉消息,一次最多拉多少条

PullConsumer 配置

参数名默认值说明
consumerGroupDEFAULT_CONSUMERConsumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组
brokerSuspendMaxTimeMillis20000长轮询,Consumer 拉消息请求在 Broker挂起最长时间,单位毫秒
consumerTimeoutMillisWhenSuspend30000长轮询,Consumer 拉消息请求在 Broker挂起超过指定时间,客户端认为超时,单位毫秒
consumerPullTimeoutMillis10000非长轮询,拉消息超时时间,单位毫秒
messageModelBROADCASTING消息支持两种模式:集群消费和广播消费
messageQueueListener监听队列变化
offsetStore消费进度存储
registerTopics注册的topic集合
allocateMessageQueueStrategyAllocateMessageQueueAveragelyRebalance算法实现策略

十六、命令行表 mqadmin

主题命令

名称含义命令选项说明
updateTopic创建更新 Topic 配置-bBroker 地址,表示 topic 所在 Broker,只支持单台Broker,地址为 ip:port
-ccluster 名称,表示 topic 所在集群(集群可通过 clusterList 查找)
-h打印帮助
-nNameServer服务地址,格式 ip:port
-p指定新topic的读写权限( W=2 )
-r可读队列数(默认为 8)
- w可写队列数(默认为 8)
-ttopic 名称(名称只能使用字符 ^[a-zA Z0-9_-]+$ )
deleteTopic删除 Topic-ccluster 名称,表示删除某集群下的某个 topic (集群可通过 clusterList 查找)
-h打印帮助
-nNameServer 服务地址,格式 ip:port
-ttopic 名称(名称只能使用字符 ^[a-zA Z0-9_-]+$ )
topicList查看 Topic 列表信息-h打印帮助
-c不配置-c只返回topic列表,增加-c返回 clusterName, topic, consumerGroup 信息,即topic的所属集群和订阅关系, 没有参数
-nNameServer 服务地址,格式 ip:port
topicRoute查看 Topic 路由信息-ttopic 名称
-h打印帮助
-nNameServer 服务地址,格式 ip:port
topicStatus查看 Topic 消息队列 offset-ttopic 名称
-h打印帮助
-nNameServer 服务地址,格式 ip:port
# 查看指定 NameServer 下的主题
mqadmin topicList -n node1:9876

# 查看指定 NameServer,指定集群名称下的主题
mqadmin topicList -n node1:9876 -c DefaultCluster

# 创建主题,指定 NameServer,指定 Broker 指定主题名称,指定主题的写队列个数,指定读主题队列个数
mqadmin updateTopic -b node1:10911 -r 3 -w 3 -t tp_admin_01

# 描述主题,指定 NameServer,指定主题名称
mqadmin topicStatus -t tp_admin_01 -n node1:9876

# 创建主题,指定 NameServer,指定集群名称,指定主题名称,指定读主题队列个数,指定写主题队列个数
mqadmin updateTopic -c DefaultCluster -n node1:9876 -r 3 -w 3 -t tp_admin_02

# 查看指定主题的状态,指定 NameServer 地址,指定主题名称
mqadmin topicStatus -t tp_admin_02 -n node1:9876

# 删除主题,指定 NameServer 地址,指定集群名称,指定主题名称
mqadmin deleteTopic -n node1:9876 -c DefaultCluster -t tp_admin_03

# 查看主题所在的集群,指定 NameServer 地址,指定主题名称。因为不同集群可以拥有同名的主题,并且不同集群可以注册到同一个 NameServer
mqadmin topicClusterList -n node1:9876 -t tp_admin_02

# 计算消费的负载均衡,不同的-i列表,计算不同的消费平衡负载结果
mqadmin allocateMQ -n node1:9876 -t tp_admin_02 -i node1,node3
mqadmin allocateMQ -n node1:9876 -t tp_admin_02 -i node1,node2,node3,node4

# 打印 Topic 订阅关系、TPS、积累量、24h读写总量等信息
mqadmin statsAll -n node1:9876

集群命令

名称含义命令选项说明
clusterList查看集群信息,集群、 BrokerName、BrokerId、 TPS等信息- m打印更多信息 (增加打印出如下信息 #InTotalYest, #OutTotalYest, #InTotalToday ,#OutTotalToday)
-h打印帮助
-nNameServer 服务地址,格式 ip:port
-i打印间隔,单位秒
clusterRT发送消息检测集群各 Broker RT。消息发往 ${BrokerName} Topic。-aamount,每次探测的总数,RT = 总时间 / amount
-s消息大小,单位B
-c探测哪个集群
-p是否打印格式化日志
-h打印帮助
- m所属机房,打印使用
-i发送间隔,单位秒
-nNameServer 服务地址,格式 ip:port
# 查看集群信息,集群、BrokerName、BrokerId、TPS等信息
mqadmin clusterList -n node1:9876 -i 1 -m

# 检查集群中broker的延迟。
mqadmin clusterRT -a 5 -s 1048576 -c DefaultCluster -p true -i 2 -n node1:9876

Broker命令

名称含义命 令 选 项说明
updateBrokerConfig更新 Broker 配置文档,会修改 Broker.conf-bBroker 为ip:port 地址,格式
-ccluster 名称
-kkey 值
-vvalue 值
-h打印帮助
-nNameServer 服务地址,格式 ip:port
brokerStatus查看 Broker 统计信息、运行状态(你想要的信息几乎都在里面)-bBroker 为ip:port 地址,地址
-h打印帮助
-nNameServer 服务地址,格式 ip:port
brokerConsumeStatsBroker 中各个消费者的消费情况, 按 Message Queue 维度返回 Consume Offset,Broker Offset, Diff,TImestamp 等信息-bBroker 地址,地址为ip:port
-t请求超时时间
-ldiff阈值,超过阈值 才打印
-o是否为顺序topic, 一般为false
-h打印帮助
-nNameServer 服务地址,格式 ip:port
getBrokerConfig获取 Broker 配置-bBroker 地址,地址为ip:port
-nNameServer 服务地址,格式 ip:port
wipeWritePerm从 NameServer 上清除 Broker 写权限-bBroker 地址,地址为ip:port
-nNameServer 服务地址,格式 ip:port
-h打印帮助
cleanExpiredCQ清理 Broker上过期的 Consume Queue, 如果手动减少对列数可能产生过期队列-nNameServer 服务地址,格式 ip:port
-h打印帮助
-bBroker 地址,地址为ip:port
-c集群名称
cleanUnusedTopic清理 Broker上不使用的 Topic,从内存 中释放 Topic 的 Consume Queue, 如果手动删除 Topic 会产生不使用的 Topic-nNameServer 服务地址,格式 ip:port
-h打印帮助
-bBroker 地址,地址为ip:port
-c集群名称
sendMsgStatus向Broker发消息,返回发送状态和RT-nNameServer 服务地址,格式 ip:port
-h打印帮助
-bBrokerName,注意不同于Broker地址
-s消息大小,单位B
-c发送次数
# 查看broker状态
mqadmin brokerStatus -b node1:10911
mqadmin brokerStatus -n node1:9876 -b node2:10911

# 修改节点的配置,配置文档也会修改
mqadmin updateBrokerConfig -n node1:9876 -b node2:10911 -c DefaultCluster -k brokerRole -v ASYNC_MASTER -k brokerId -v 0 -k brokerName -v 'broker-c'

# 获取Broker配置
mqadmin getBrokerConfig -n node1:9876 -b node3:10911

# 清理Broker上不使用的Topic,从内存中释放Topic的Consume Queue,如果手动删除Topic会产生不使用的Topic
mqadmin cleanUnusedTopic -n node1:9876 -b node1:10911 -c DefaultCluster

# 向Broker发消息,返回发送状态和RT
mqadmin sendMsgStatus -n node1:9876 -b broker-b -s 128 -c 5

消息命令

名称含意命令选项说明
queryMsgById根据 offsetMsgId 查找 msg,如果 使用开源控制台,应使用 offsetMsgId,此命令还有其他参数,具体作用请阅读 QueryMsgByIdSubCommand。-imsgId
-h打印帮助
-nNameServer 服务地址,格式 ip:port
queryMsgByKey根据消息 Key 查找消息-kmsgKey
-tTopic名称
-h打印帮助
-nNameServer 服务地址,格式 ip:port
queryMsgByOffset根据 Offset 查找消息-bBroker 名称,(这里需 要注意 填写的是 Broker 的名称,不是 Broker 的地址, Broker 名称可以在 clusterList 查到)
-iquery 队列 id
-ooffset 值
-ttopic 名称
-h打印帮助
-nNameServer 服务地址,格式 ip:port
queryMsgByUniqueKey根据msgId查找,msgId 不同于 offsetMsgId,区别详见常见运维 问题。 -g,-d配合使用,查到消息 后尝试让特定的消费者消费消息并 返回消费结果-h打印帮助
-nNameServer 服务地址,格式 ip:port
-iuniqe msg id
-gconsumerGroup
-dclientId
-ttopic名称
checkMsgSendRT检测向topic发消息的RT,功能类 似 clusterRT-h打印帮助
-nNameServer 服务地址,格式 ip:port
-ttopic名称
-a探测次数
-s消息大小
sendMessage发送一条消息,可以根据配置发往 特定Message Queue,或普通发送。-h打印帮助
-nNameServer 服务地址,格式 ip:port
-ttopic名称
-pbody,消息体
-kkeys
-ctags
-bBrokerName
-iqueueId
consumeMessage消费消息。可以根据offset、开始&结束时间戳、消息队列消费消 息,配置不同运行不同消费逻辑, 详见 ConsumeMessageCommand。-h打印帮助
-nNameServer 服务地址,格式 ip:port
-ttopic名称
-bBrokerName
-o从offset开始消费
-iqueueId
-g消费者分组
-s开始时间戳,格式详见-h
-d结束时间戳
-c消费多少条消息
printMsg从 Broker 消费消息并打印,可选时间段-h打印帮助
-nNameServer 服务地址,格式 ip:port
-ttopic名称
-c字符集,例如UTF-8
-ssubExpress,过滤表达式
-b开始时间戳,格式参见-h
-e结束时间戳
-d是否打印消息体
printMsgByQueue类似 printMsg,但指定 Message Queue-h打印帮助
-nNameServer 服务地址,格式 ip:port
-ttopic名称
-iqueueId
-aBrokerName
-c字符集,例如UTF-8
-ssubExpress,过滤表达式
-b开始时间戳,格式参见-h
-e结束时间戳
-p是否打印消息
-d是否打印消息体
-f是否统计tag数量并打印
resetOffsetByTime按时间戳重置 offset,Broker 和 consumer 都会重置-h打印帮助
-nNameServer 服务地址,格式 ip:port
-g消费者分组
-ttopic名称
-s重置为此时间戳对应的 offset
-f是否强制重置,如果 false,只支持回溯 offset,如果true,不 管时间戳对应offset与 consumeOffset关系
-c是否重置c++客户端 offset
# 根据MsgKey查找消息,指定NameServer地址,指定主题名称,指定MsgKey
mqadmin queryMsgByKey -n node1:9876 -t tp_admin_01 -k 00100

# 根据UNIQ_KEY查找消息,指定NameServer地址,指定UNIQ_KEY,指定消费组名称,指定主题名
mqadmin queryMsgByUniqueKey -n node1:9876 -i C0A864672C8B277050DC5F8417BA0000 -g test_grp_console -t tp_admin_01

# 发送检查消息延迟,指定NameServer,指定主题,指定测试次数,指定消息大小,默认128KB
mqadmin checkMsgSendRT -n node1:9876 -t tp_admin_01 -a 5 -s 128

# 指定发送消息的大小,以测试延迟 1MB
mqadmin checkMsgSendRT -n node1:9876 -t tp_admin_01 -a 5 -s 1048576

# 消费消息,指定NameServer,指定主题,指定broker名称,指定MQ的id
mqadmin consumeMessage -n node1:9876 -t tp_admin_01 -o 0 -b broker-a -i 0

# 发送消息,指定主题,指定NameServer地址,指定消息体
mqadmin sendMessage -n node1:9876 -t tp_admin_01 -p 'hello lagou console'

# 发送消息,指定主题,指定NameServer地址,指定消息体,指定keys,指定tags
mqadmin sendMessage -n node1:9876 -t tp_admin_01 -p 'hello lagou console' -k '00100' -c 'test'

# 发送消息,指定NameServer,指定消息体,指定Broker,指定主题
mqadmin sendMessage -n node1:9876 -p 'hello lagou test 01' -b broker-a -i 0 -t 'tp_admin_01'

# 查看偏移量,指定NameServer,指定主题
mqadmin topicStatus -n node1:9876 -t tp_admin_01

# 打印消息,指定NameServer地址,指定主题,指定标签过滤,指定是否打印消息体
mqadmin printMsg -n node1:9876 -t tp_admin_01 -s "*" -d true

消费组命令

名称含意命令选项说名
consumerProgress查看订阅组消费状态, 可以查看具体的client IP的消息积累量-g消费者所属组名
-s是否打印client IP
-h打印帮助
-nNameServer 服务地址,格式 ip:port
consumerStatus查看消费者状态, 包括同一个分组中是否都是相同 的订阅, 分析Process Queue 是否堆积, 返回消费者jstack结果,内容较多,用户参见 ConsumerStatusSubCommand-h打印帮助
-nNameServer 服务地址,格 式 ip:port
-gconsumer group
-iclientId
-s是否运行jstack
updateSubGroup更新或创建订阅关系-nNameServer 服务地址,格式 ip:port
-h打印帮助
-bBroker地址
-c集群名称
-g消费者分组名称
-s分组是否允许消费
-m是否从最小offset开始消费
-d是否是广播模式
-q重试队列数量
-r最大重试次数
-i当slaveReadEnable开启时有效,且还未达到从slave消 费时建议从哪个BrokerId消 费,可以配置备机id,主动 从备机消费
-w如果Broker建议从slave消费,配置决定从哪个slave消费,配置BrokerId,例如1
-a当消费者数量变化时是否通 知其他消费者负载均衡
deleteSubGroup从 Broker 删除订阅关系-nNameServer 服务地址,格式 ip:port
-h打印帮助
-bBroker地址
-c集群名称
-g消费者分组名称
cloneGroupOffset在目标群组中使用源群组的 offset-nNameServer 服务地址,格式 ip:port
-h打印帮助
-s源消费者组
-d目标消费者组
-ttopic名称
-o暂未使用
# 查看消费者状态
mqadmin consumerStatus -n node1:9876 -g mygrp_consume -s

连接命令

名称含意命令选项说明
consumerConnection查找 Consumer 的网络连接-g消费者所属组名
-nNameServer 服务地址,格式 ip:port
-h打印帮助
producerConnection查找 Producer 的网络连接-g生产者所属组名
-t主题名称
-nNameServer 服务地址,格式 ip:port
-h打印帮助
# 查看生产者连接
mqadmin producerConnection -g mygrp -t tp_admin_01 -n node1:9876
# 查看消费者连接
mqadmin consumerConnection -g mygrp_consume -n node1:9876

NameServer命令

名称含意命令选项说名
updateKvConfig更新 NameServer 的 kv 配置, 目前还未使用 -s命名空间
-kkey
-vvalue
-nNameServer 服务地址, 格式 ip:port
-h打印帮助
deleteKvConfig删除 NameServer 的 kv 配置-s命名空间
-kkey
-nNameServer 服务地址, 格式 ip:port
-h打印帮助
getNamesrvConfig获取 NameServer 配置-nNameServer 服务地址, 格式 ip:port
-h打印帮助
updateNamesrvConfig修改 NameServer 配置-nNameServer 服务地址, 格式 ip:port
-h打印帮助
-kkey
-vvalue
# 获取 NameServer 配置信息
mqadmin getNamesrvConfig -n node1:9876
# 修改 NameServer 的配置
mqadmin updateNamesrvConfig -n node1:9876 -k serverWorkerThreads -v 10

其它命令

名称含意命令选项说名
startMonitoring开启监控进程,监控消息误删、重试队列消息数等-nNameServer 服务地址, 格式 ip:port
-h打印帮助