RocketMQ
分布式消息中间件
一、应用场景
- 系统解偶 - 主要流程与次要流程分离 - 系统耦合性越高,容错性越低
- 流量削峰 - 将大量请求缓存,分散到长时间处理
- 数据分发 - 让数据在多个系统间流通
二、角色
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 是否在消息落盘后才回应
可视化工具
三、生产者消息发送
模式
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 当机,将无法发送消息
保证全局消息顺序
- Topic 的 MessageQueue 数量设为 1
- 消费端使用 MessageListenerOrderly - 保证单个 MessageQueue 中可以顺序消费
- setConsumeThreadMin 、setConsumeThreadMax 设为 1 - 并发数
- setPullBatchSize 设为 1 - 单次 Pull 消息最大数量
- setConsumeMessageBatchMaxSize 设为 1 - 单次 Push 消息数量
消费点位
- CONSUME_FROM_LAST_OFFSET - 忽略历史消息
- CONSUME_FROM_FIRST_OFFSET - 消费每个存在于 Broker 的消息
- CONSUME_FROM_TIMESTAMP - 消费指定时间戳后的消息
五、Broker 存储结构
-
ConsumeQueue - 逻辑队列,消息的索引文档
-
内容
- CommitLog 中消息的偏移量 - 8字节
- 消息大小 - 4字节
- 消息 Tag 的 Hash 值 - 8字节
-
保存 30 万条索引纪录,约 5.72 MB
-
-
CommitLog - 消息存储文档
-
默认大小 1G
-
文档名为偏移量,长度 20 位
-
-
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 两阶段提交
运行原理
- Producer 发送 half 消息到 RMQ_SYS_TRANS_HALF_TOPIC 主题
- 当要进行 Commit 或 Rollback 时,发送一个 op 消息,将 half 消息标记为确定状态 - 未确定消息默认回查15次,默认回滚
- 当是进行 Commit 时,取出 op 消息中的 half 消息位置,为 half 消息创建索引
- 创建 half 消息索引后,half 消息可见,即可透过 half 消息恢复出原消息,并将消息存入原来的 Topic
十一、消息优先级
RocketMQ 不支持 Topic 级别的优先级设置,需要自行实现
-
某类消息流量大,导致其它类型的消息无法正常消费
-
将流量大的消息单独制定一个 Topic,其它类型一个 Topic,并创建两个 Consumer 分别消费
-
将每个类型的消息都制定一个 MessageQueue,DefaultMQPushConsumer 是透过轮循 MessageQueue 进行消费
-
-
强制优先级
创建多个 Topic,多个 Consumer,自主控制消费时机
十二、流量控制
1. 生产者
Broker 处理能力达到瓶颈,拒绝发送请求,不会重投消息
- commitLog 被锁时间超过 osPageCacheBusyTimeOutMills - 默认 1000ms
- 开启 transientStorePoolEnable = true 且 Broker 为异步刷盘,transientStorePool 资源不足
- Broker 处理请求时间超过 waitTimeMillsInSendQueue - 默认 200ms
2. 消费者
消费能力达到瓶颈,降低拉取频率
- 本地缓存消息数超过 pullThresholdForQueue - 默认 1000
- 本地缓存消息大小超过 pullThresholdSizeForQueue - 默认 100 MB
- 本地缓存消息跨度超过 consumeConcurrentlyMaxSpan - 默认 2000
十三、集群模式
-
单 Master
-
Broker 当机,服务不可用,仅用于本地测试
-
-
多 Master
-
单个 Master 当机期间,该机器上未被消费的消息不可订阅,同步刷盘消息不丢,异步刷盘丢失少量消息
-
-
多 Master 多 Slave (异步)
-
Master 当机,Consumer 仍可从 Slave 消费
-
Master 硬盘损坏,丢失少量消息
-
-
多 Master 多 Slave (同步)
-
消息不丢失,可用性高,比异步复制性能略低 10%
-
备机不能自动切换为主机
-
十四、优化
1. 写入性能
- 采用 Oneway 方式发送
2. 消费性能
-
增加 Consumer 实例
-
增加处理线程数
-
consumeThreadMin
-
consumeThreadMax
-
-
批量消费 - consumeMessageBatchMaxSize - 默认 1
-
跳过非重要消息
十五、配置参数
Broker 配置文档
/opt/rocket/conf/broker.conf
参数名 | 默认值 | 说明 |
---|---|---|
listenPort | 10911 | 接受客户端连接的监听端口 |
namesrvAddr | null | nameServer 地址 |
brokerIP1 | 网卡的 InetAddress | 当前 broker 监听的 IP |
brokerIP2 | 跟 brokerIP1 一样 | 存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性, broker 从节点会连接主节点配置的 brokerIP2 进行同步 |
brokerName | null | broker 的名称 |
brokerClusterName | DefaultCluster | 本 broker 所属的 Cluser 名称 |
brokerId | 0 | broker id, 0 表示 master, 其他的正整数表示 slave |
storePathCommitLog | $HOME/store/commitlog/ | 存储 commit log 的路径 |
storePathConsumerQueue | $HOME/store/consumequeue/ | 存储 consume queue 的路径 |
mapedFileSizeCommitLog | 1024 * 1024 * 1024(1G) | commit log 的映射文档大小 |
deleteWhen | 04 | 在每天的什么时间删除已经超过文档保 留时间的 commit log |
fileReserverdTime | 72 | 以小时计算的文档保留时间 |
brokerRole | ASYNC_MASTER | SYNC_MASTER 或者 ASYNC_MASTER 或者 SLAVE SYNC_MASTER表示当前broker是一个 同步复制的Master ASYNC_MASTER表示当前broker是一个异步复制的Master SLAVE表示当前borker是一个Slave。 |
flushDiskType | ASYNC_FLUSH | SYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保证在 收到确认生产者之前将消息刷盘。 ASYNC_FLUSH 模式下的 broker 则利 用刷盘一组消息的模式,可以取得更好的性能。 |
客户端通用配置 (Producer、Consumer)
参数名 | 默认值 | 说明 |
---|---|---|
namesrvAddr | Name Server地址列表,多个NameServer 地址用分号隔开 | |
clientIP | 本机IP | 客户端本机IP地址,某些机器会发生无法识别 客户端IP地址情况,需要应用在代码中强制指定 |
instanceName | DEFAULT | 客户端实例名称,客户端创建的多个 Producer、Consumer实际是共用一个内部实例(这个实例包含网络连接、线程资源等) |
clientCallbackExecutorThreads | 4 | 通信层异步回调线程数 |
pollNameServerInteval | 30000 | 轮询Name Server间隔时间,单位毫秒 |
heartbeatBrokerInterval | 30000 | 向Broker发送心跳间隔时间,单位毫秒 |
persistConsumerOffsetInterval | 5000 | 持久化Consumer消费进度间隔时间,单位毫秒 |
Producer 配置
参数名 | 默认值 | 说明 |
---|---|---|
producerGroup | DEFAULT_PRODUCER | Producer组名,多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组 |
createTopicKey | TBW102 | 在发送消息时,自动创建服务器不存在的topic,需要指定Key,该 Key可用于配置发送消息所在topic 的默认路由。 |
defaultTopicQueueNums | 4 | 在发送消息,自动创建服务器不存在的topic时,默认创建的队列数 |
sendMsgTimeout | 10000 | 发送消息超时时间,单位毫秒 |
compressMsgBodyOverHowmuch | 4096 | 消息Body超过多大开始压缩 (Consumer收到消息会自动解压 缩),单位字节 |
retryAnotherBrokerWhenNotStoreOK | FALSE | 如果发送消息返回sendResult,但是sendStatus!=SEND_OK,是否重试发送 |
retryTimesWhenSendFailed | 2 | 如果消息发送失败,最大重试次数,该参数只对同步发送模式起作用 |
maxMessageSize | 4MB | 客户端限制的消息大小,超过报错,同时服务端也会限制,所以需要跟服务端配合使用。 |
transactionCheckListener | 事务消息回查监听器,如果发送事务消息,必须设置 | |
checkThreadPoolMinSize | 1 | Broker回查Producer事务状态时, 线程池最小线程数 |
checkThreadPoolMaxSize | 1 | Broker回查Producer事务状态时, 线程池最大线程数 |
checkRequestHoldMax | 2000 | Broker回查Producer事务状态时, Producer本地缓冲请求队列大小 |
RPCHook | null | 该参数是在Producer创建时传入的,包含消息发送前的预处理和消息响应后的处理两个接口,用户可以在第一个接口中做一些安全控制或者其他操作 |
PushConsumer 配置
参数名 | 默认值 | 说明 |
---|---|---|
consumerGroup | DEFAULT_CONSUMER | Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组 |
messageModel | CLUSTERING | 消费模型支持集群消费和广播消费两种 |
consumeFromWhere | CONSUME_FROM_LAST_OFFSET | Consumer启动后,默认从上次消费的位置开始消费,这包含两种情况:一种是上次消费的位置未过期,则消费从上次中止的位置进行;一种是上次消费位置已经过期,则从当前队列第一条消息开始消费 |
consumeTimestamp | 半个小时前 | 只有当consumeFromWhere值为 CONSUME_FROM_TIMESTAMP时才起作用。 |
allocateMessageQueueStrategy | AllocateMessageQueueAveragely | Rebalance算法实现策略 |
subscription | 订阅关系 | |
messageListener | 消息监听器 | |
offsetStore | 消费进度存储 | |
consumeThreadMin | 10 | 消费线程池最小线程数 |
consumeThreadMax | 20 | 消费线程池最大线程数 |
consumeConcurrentlyMaxSpan | 2000 | 单队列并行消费允许的最大跨度 |
pullThresholdForQueue | 1000 | 拉消息本地队列缓存消息最大数 |
pullInterval | 0 | 拉消息间隔,由于是长轮询,所以为0,但是如果应用为了流控,也可以设置大于0的值,单位毫秒 |
consumeMessageBatchMaxSize | 1 | 批量消费,一次消费多少条消息 |
pullBatchSize | 32 | 批量拉消息,一次最多拉多少条 |
PullConsumer 配置
参数名 | 默认值 | 说明 |
---|---|---|
consumerGroup | DEFAULT_CONSUMER | Consumer组名,多个Consumer如果属于一个应用,订阅同样的消息,且消费逻辑一致,则应该将它们归为同一组 |
brokerSuspendMaxTimeMillis | 20000 | 长轮询,Consumer 拉消息请求在 Broker挂起最长时间,单位毫秒 |
consumerTimeoutMillisWhenSuspend | 30000 | 长轮询,Consumer 拉消息请求在 Broker挂起超过指定时间,客户端认为超时,单位毫秒 |
consumerPullTimeoutMillis | 10000 | 非长轮询,拉消息超时时间,单位毫秒 |
messageModel | BROADCASTING | 消息支持两种模式:集群消费和广播消费 |
messageQueueListener | 监听队列变化 | |
offsetStore | 消费进度存储 | |
registerTopics | 注册的topic集合 | |
allocateMessageQueueStrategy | AllocateMessageQueueAveragely | Rebalance算法实现策略 |
十六、命令行表 mqadmin
主题命令
名称 | 含义 | 命令选项 | 说明 |
---|---|---|---|
updateTopic | 创建更新 Topic 配置 | -b | Broker 地址,表示 topic 所在 Broker,只支持单台Broker,地址为 ip:port |
-c | cluster 名称,表示 topic 所在集群(集群可通过 clusterList 查找) | ||
-h | 打印帮助 | ||
-n | NameServer服务地址,格式 ip:port | ||
-p | 指定新topic的读写权限( W=2 ) | ||
-r | 可读队列数(默认为 8) | ||
- w | 可写队列数(默认为 8) | ||
-t | topic 名称(名称只能使用字符 ^[a-zA Z0-9_-]+$ ) | ||
deleteTopic | 删除 Topic | -c | cluster 名称,表示删除某集群下的某个 topic (集群可通过 clusterList 查找) |
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
-t | topic 名称(名称只能使用字符 ^[a-zA Z0-9_-]+$ ) | ||
topicList | 查看 Topic 列表信息 | -h | 打印帮助 |
-c | 不配置-c只返回topic列表,增加-c返回 clusterName, topic, consumerGroup 信息,即topic的所属集群和订阅关系, 没有参数 | ||
-n | NameServer 服务地址,格式 ip:port | ||
topicRoute | 查看 Topic 路由信息 | -t | topic 名称 |
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
topicStatus | 查看 Topic 消息队列 offset | -t | topic 名称 |
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 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 | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
-i | 打印间隔,单位秒 | ||
clusterRT | 发送消息检测集群各 Broker RT。消息发往 ${BrokerName} Topic。 | -a | amount,每次探测的总数,RT = 总时间 / amount |
-s | 消息大小,单位B | ||
-c | 探测哪个集群 | ||
-p | 是否打印格式化日志 | ||
-h | 打印帮助 | ||
- m | 所属机房,打印使用 | ||
-i | 发送间隔,单位秒 | ||
-n | NameServer 服务地址,格式 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 | -b | Broker 为ip:port 地址,格式 |
-c | cluster 名称 | ||
-k | key 值 | ||
-v | value 值 | ||
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
brokerStatus | 查看 Broker 统计信息、运行状态(你想要的信息几乎都在里面) | -b | Broker 为ip:port 地址,地址 |
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
brokerConsumeStats | Broker 中各个消费者的消费情况, 按 Message Queue 维度返回 Consume Offset,Broker Offset, Diff,TImestamp 等信息 | -b | Broker 地址,地址为ip:port |
-t | 请求超时时间 | ||
-l | diff阈值,超过阈值 才打印 | ||
-o | 是否为顺序topic, 一般为false | ||
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
getBrokerConfig | 获取 Broker 配置 | -b | Broker 地址,地址为ip:port |
-n | NameServer 服务地址,格式 ip:port | ||
wipeWritePerm | 从 NameServer 上清除 Broker 写权限 | -b | Broker 地址,地址为ip:port |
-n | NameServer 服务地址,格式 ip:port | ||
-h | 打印帮助 | ||
cleanExpiredCQ | 清理 Broker上过期的 Consume Queue, 如果手动减少对列数可能产生过期队列 | -n | NameServer 服务地址,格式 ip:port |
-h | 打印帮助 | ||
-b | Broker 地址,地址为ip:port | ||
-c | 集群名称 | ||
cleanUnusedTopic | 清理 Broker上不使用的 Topic,从内存 中释放 Topic 的 Consume Queue, 如果手动删除 Topic 会产生不使用的 Topic | -n | NameServer 服务地址,格式 ip:port |
-h | 打印帮助 | ||
-b | Broker 地址,地址为ip:port | ||
-c | 集群名称 | ||
sendMsgStatus | 向Broker发消息,返回发送状态和RT | -n | NameServer 服务地址,格式 ip:port |
-h | 打印帮助 | ||
-b | BrokerName,注意不同于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。 | -i | msgId |
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
queryMsgByKey | 根据消息 Key 查找消息 | -k | msgKey |
-t | Topic名称 | ||
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
queryMsgByOffset | 根据 Offset 查找消息 | -b | Broker 名称,(这里需 要注意 填写的是 Broker 的名称,不是 Broker 的地址, Broker 名称可以在 clusterList 查到) |
-i | query 队列 id | ||
-o | offset 值 | ||
-t | topic 名称 | ||
-h | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
queryMsgByUniqueKey | 根据msgId查找,msgId 不同于 offsetMsgId,区别详见常见运维 问题。 -g,-d配合使用,查到消息 后尝试让特定的消费者消费消息并 返回消费结果 | -h | 打印帮助 |
-n | NameServer 服务地址,格式 ip:port | ||
-i | uniqe msg id | ||
-g | consumerGroup | ||
-d | clientId | ||
-t | topic名称 | ||
checkMsgSendRT | 检测向topic发消息的RT,功能类 似 clusterRT | -h | 打印帮助 |
-n | NameServer 服务地址,格式 ip:port | ||
-t | topic名称 | ||
-a | 探测次数 | ||
-s | 消息大小 | ||
sendMessage | 发送一条消息,可以根据配置发往 特定Message Queue,或普通发送。 | -h | 打印帮助 |
-n | NameServer 服务地址,格式 ip:port | ||
-t | topic名称 | ||
-p | body,消息体 | ||
-k | keys | ||
-c | tags | ||
-b | BrokerName | ||
-i | queueId | ||
consumeMessage | 消费消息。可以根据offset、开始&结束时间戳、消息队列消费消 息,配置不同运行不同消费逻辑, 详见 ConsumeMessageCommand。 | -h | 打印帮助 |
-n | NameServer 服务地址,格式 ip:port | ||
-t | topic名称 | ||
-b | BrokerName | ||
-o | 从offset开始消费 | ||
-i | queueId | ||
-g | 消费者分组 | ||
-s | 开始时间戳,格式详见-h | ||
-d | 结束时间戳 | ||
-c | 消费多少条消息 | ||
printMsg | 从 Broker 消费消息并打印,可选时间段 | -h | 打印帮助 |
-n | NameServer 服务地址,格式 ip:port | ||
-t | topic名称 | ||
-c | 字符集,例如UTF-8 | ||
-s | subExpress,过滤表达式 | ||
-b | 开始时间戳,格式参见-h | ||
-e | 结束时间戳 | ||
-d | 是否打印消息体 | ||
printMsgByQueue | 类似 printMsg,但指定 Message Queue | -h | 打印帮助 |
-n | NameServer 服务地址,格式 ip:port | ||
-t | topic名称 | ||
-i | queueId | ||
-a | BrokerName | ||
-c | 字符集,例如UTF-8 | ||
-s | subExpress,过滤表达式 | ||
-b | 开始时间戳,格式参见-h | ||
-e | 结束时间戳 | ||
-p | 是否打印消息 | ||
-d | 是否打印消息体 | ||
-f | 是否统计tag数量并打印 | ||
resetOffsetByTime | 按时间戳重置 offset,Broker 和 consumer 都会重置 | -h | 打印帮助 |
-n | NameServer 服务地址,格式 ip:port | ||
-g | 消费者分组 | ||
-t | topic名称 | ||
-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 | 打印帮助 | ||
-n | NameServer 服务地址,格式 ip:port | ||
consumerStatus | 查看消费者状态, 包括同一个分组中是否都是相同 的订阅, 分析Process Queue 是否堆积, 返回消费者jstack结果,内容较多,用户参见 ConsumerStatusSubCommand | -h | 打印帮助 |
-n | NameServer 服务地址,格 式 ip:port | ||
-g | consumer group | ||
-i | clientId | ||
-s | 是否运行jstack | ||
updateSubGroup | 更新或创建订阅关系 | -n | NameServer 服务地址,格式 ip:port |
-h | 打印帮助 | ||
-b | Broker地址 | ||
-c | 集群名称 | ||
-g | 消费者分组名称 | ||
-s | 分组是否允许消费 | ||
-m | 是否从最小offset开始消费 | ||
-d | 是否是广播模式 | ||
-q | 重试队列数量 | ||
-r | 最大重试次数 | ||
-i | 当slaveReadEnable开启时有效,且还未达到从slave消 费时建议从哪个BrokerId消 费,可以配置备机id,主动 从备机消费 | ||
-w | 如果Broker建议从slave消费,配置决定从哪个slave消费,配置BrokerId,例如1 | ||
-a | 当消费者数量变化时是否通 知其他消费者负载均衡 | ||
deleteSubGroup | 从 Broker 删除订阅关系 | -n | NameServer 服务地址,格式 ip:port |
-h | 打印帮助 | ||
-b | Broker地址 | ||
-c | 集群名称 | ||
-g | 消费者分组名称 | ||
cloneGroupOffset | 在目标群组中使用源群组的 offset | -n | NameServer 服务地址,格式 ip:port |
-h | 打印帮助 | ||
-s | 源消费者组 | ||
-d | 目标消费者组 | ||
-t | topic名称 | ||
-o | 暂未使用 |
# 查看消费者状态
mqadmin consumerStatus -n node1:9876 -g mygrp_consume -s
连接命令
名称 | 含意 | 命令选项 | 说明 |
---|---|---|---|
consumerConnection | 查找 Consumer 的网络连接 | -g | 消费者所属组名 |
-n | NameServer 服务地址,格式 ip:port | ||
-h | 打印帮助 | ||
producerConnection | 查找 Producer 的网络连接 | -g | 生产者所属组名 |
-t | 主题名称 | ||
-n | NameServer 服务地址,格式 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 | 命名空间 |
-k | key | ||
-v | value | ||
-n | NameServer 服务地址, 格式 ip:port | ||
-h | 打印帮助 | ||
deleteKvConfig | 删除 NameServer 的 kv 配置 | -s | 命名空间 |
-k | key | ||
-n | NameServer 服务地址, 格式 ip:port | ||
-h | 打印帮助 | ||
getNamesrvConfig | 获取 NameServer 配置 | -n | NameServer 服务地址, 格式 ip:port |
-h | 打印帮助 | ||
updateNamesrvConfig | 修改 NameServer 配置 | -n | NameServer 服务地址, 格式 ip:port |
-h | 打印帮助 | ||
-k | key | ||
-v | value |
# 获取 NameServer 配置信息
mqadmin getNamesrvConfig -n node1:9876
# 修改 NameServer 的配置
mqadmin updateNamesrvConfig -n node1:9876 -k serverWorkerThreads -v 10
其它命令
名称 | 含意 | 命令选项 | 说名 |
---|---|---|---|
startMonitoring | 开启监控进程,监控消息误删、重试队列消息数等 | -n | NameServer 服务地址, 格式 ip:port |
-h | 打印帮助 |