如果你每天都在用 mqadmin 查 Topic、看消费进度、拉消息体,或者在服务器上跑一个 rocketmq-console 进程只为偶尔看一眼集群状态——这篇文章可能对你有用。

一个常见的运维场景

周五下午,线上告警:某个消费组积压了 50 万条消息。

你的操作路径大概是这样的:

# 先看哪个消费组积压了
sh mqadmin consumerProgress -n 127.0.0.1:9876

# 找到积压的 group,看看订阅了哪个 topic
sh mqadmin consumerStatus -n 127.0.0.1:9876 -g order-consumer-group

# 拉几条消息看看内容
sh mqadmin queryMsgById -n 127.0.0.1:9876 -i AC100001000012A4B2C3D4E5F6...

# 决定跳过积压
sh mqadmin resetOffsetByTime -n 127.0.0.1:9876 -g order-consumer-group -t order-topic -s now

四个命令,四次复制粘贴 NameServer 地址,消息 ID 还得从上一条命令的输出里找。如果集群开了 ACL 认证,每条命令还得加上 -ak xxx -sk xxx

这不是什么高难度操作,但足够繁琐。尤其是在需要反复查看消息内容、对比多条消息、快速切换 Topic 的场景下,命令行的效率瓶颈很明显。

为什么不用 rocketmq-console?

rocketmq-console(Web 版控制台)当然能用,但它有几个实际的问题:

部署成本不低。需要 JDK 环境,需要打 JAR 包,需要选端口,需要配置 NameServer 地址。如果集群有多套环境(开发/测试/生产),要么部署多个 console,要么频繁改配置。

安全性顾虑。console 默认无认证,直接暴露集群管理能力。放在内网还好,放在公网就是安全黑洞。生产环境一般不会随便部署。

功能覆盖不全。console 侧重查看,操作能力有限。比如按 msgKey 查消息、按时间戳拉取消息、重置消费位点到指定 offset,这些操作 console 要么不支持,要么操作路径很深。

RocketMQ Manager:桌面原生方案

[RocketMQ Manager是一个 JavaFX 桌面 GUI 工具,定位很简单:把 mqadmin 的常用操作变成点击和输入框

它能做什么

连接管理

  • 支持 NameServer 直连
  • 支持 ACL 认证(accessKey/secretKey)
  • 支持 TLS 加密传输
  • 多套环境配置保存,一键切换
    在这里插入图片描述

集群总览(驾驶舱)

  • 一次加载展示:Broker 数量、Topic 数量、消费组数量、总 TPS
  • 采用并行查询(8 线程并发获取消费组统计),数据加载速度比串行快数倍
  • 消费组积压量一目了然
    在这里插入图片描述

Topic 管理

  • Topic 列表、队列统计(minOffset/maxOffset/lastUpdate)
  • Topic 路由信息(Broker 分布、Master/Slave 角色)
  • Topic 配置(读写队列数、权限 R/W、是否顺序消息)
  • Topic 消费者详情(消费组、客户端 ID/地址、消费进度、积压量)
  • Topic 生产者连接信息
    在这里插入图片描述

消费组管理

  • 消费组列表 + TPS + 积压总量
  • 消费组客户端连接信息(clientId、clientAddr、语言、版本)
  • 消费组连接元信息(consumeType、messageModel、consumeFromWhere)
  • 消费组订阅信息
  • 消费组偏移详情(每队列 brokerOffset/consumerOffset/diff)
    在这里插入图片描述

消息操作

  • 六种拉取方式:最早消息、最新消息、按 Offset、按时间戳、按 msgId、按 msgKey
  • 消息内容支持 JSON / RAW / XML / HEX 四种格式化展示
  • 在线发送消息(支持 tag、keys、body)
  • 消息字段完整展示:msgId、uniqKey、queueId、queueOffset、tags、keys、bodySize、bornTimestamp、storeTimestamp、brokerName

偏移量管理

  • 跳过消息堆积(resetOffsetByTimestamp 到当前时间,各队列回到最新位点)
  • 按指定 offset 重置(resetOffsetNew)
  • 按时间戳重置(resetOffsetByTimestamp)

一个细节:连接预热

用过 RocketMQ Admin API 的人可能注意到,DefaultMQAdminExt.start() 首次调用会卡 10-15 秒。这是因为底层需要初始化 MQClientInstance、扫描路由、建立网络连接。

RocketMQ Manager 在应用启动时就后台预热 Admin 和 PullConsumer 连接。用户点击「连接」时,如果配置匹配,直接复用预热好的实例,连接几乎是秒级的。如果配置不匹配(比如改了 NameServer 地址),才会走正常初始化流程。

代码层面,预热逻辑用了一个简单的锁 + 配置指纹机制:

// 构建配置唯一键 — 用于判断预热是否匹配
private String buildConfigKey(ConnectionConfig config) {
    return config.getNameServer() + "|" + config.isAuthEnabled() + "|"
        + config.getAccessKey() + "|" + config.getSecretKey() + "|"
        + config.isUseTLS();
}

连接时先检查预热线程是否完成,再比对配置指纹。匹配则复用,不匹配则新建。逻辑不复杂,但实际体验提升明显。

驾驶舱查询优化

另一个值得说的优化是驾驶舱数据加载。

原始方案是串行调用 5 次 API:getClusterInfo → getBrokers → getTopics → 逐 Topic 查消费组 → 逐消费组查 TPS。Topic 多的时候,加载时间可能超过 10 秒。

优化后的方案:

  1. 2 次 API 拿核心数据examineBrokerClusterInfo() + fetchAllTopicList()
  2. 每 Broker 一次获取消费组getAllSubscriptionGroup(addr) 替代逐 Topic queryTopicConsumeByWho
  3. 8 线程并行获取消费组 TPSexamineConsumeStats 并发执行,单次超时 5 秒

实测在 3 Broker / 50 Topic / 20 消费组的集群上,驾驶舱加载从 8 秒降到 2 秒以内。

怎么用

安装

1.下载 Windows 安装包
2. 解压到任意目录
3. 双击 RocketMQManager.bat(标准启动)

快速上手

  1. 启动后输入 NameServer 地址(如 127.0.0.1:9876
  2. 如果集群开了 ACL,勾选认证并填写 accessKey/secretKey
  3. 点击连接
  4. 左侧导航选择功能模块:驾驶舱 / Broker / Topic / 消费组 / 消息

目录结构

RocketMQ-Manager-1.0.0-Windows/
  ├── RocketMQManager.vbs          # 无窗口启动(推荐)
  ├── RocketMQManager.bat          # 标准启动
  ├── RocketMQManager-Debug.bat    # 调试模式(显示日志)
  └── app/
      ├── rocketmq-manager.jar     # 主程序
      ├── lib/                     # 依赖 JAR(25 个)
      └── javafx/                  # 内嵌 JavaFX 运行时
          ├── lib/                 # 4 个 JAR 模块
          └── bin/                 # 59 个原生 DLL

技术栈

技术 版本
GUI 框架 JavaFX 17(内嵌运行时)
消息中间件 SDK RocketMQ Client + Tools 4.9.3
JSON FastJSON 1.2.83
构建 Maven + Shade Plugin 3.9.9
打包 Bash 脚本 + Python ZIP -
JDK 17+(编译和运行) -

已知限制

  1. 仅支持 Windows:当前打包只覆盖 Windows,Linux/Mac 用户需自行编译
  2. RocketMQ 4.x 适配:使用 4.9.3 版本客户端,未测试 5.x 兼容性
  3. 单集群连接:同时只能连接一个 NameServer 集群
  4. 无 Topic 创建/删除:当前版本只支持查看和操作,不支持 Topic 的创建和删除

开源信息

  • 仓库地址:https://gitee.com/road0329/rocketmq-manager-java
  • 开源协议:Apache 2.0
  • 欢迎贡献:Issue 反馈 bug、PR 提交功能、Star 表示支持

如果你在日常运维中也被 mqadmin 的参数折腾得够呛,或者不想为偶尔看一眼集群状态就部署一个 Web 服务——试试这个桌面工具,双击就能用,关了就不占资源。

毕竟,工具的价值不在于多强大,而在于顺手。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐