BlazingMQ 0.95.20 常用 CLI 命令详解
逐条实测 BlazingMQ v0.95.20 命令行工具链:bmqbrkr 启停与版本查看、bmqtool 交互模式收发闭环(单会话、跨会话生产消费、batch-post 自增属性)、storage 模式存储文件离线检查,以及自定义域队列的实操入口与常见排障。
BlazingMQ 0.95.20 常用 CLI 命令详解
目标:系统讲清 BlazingMQ 命令行工具链的日常用法——消息代理
bmqbrkr的启动/停止/版本查看,官方多模式工具bmqtool的交互收发(单会话、跨会话生产消费、批量发送)、存储文件离线检查(storage 模式),以及域配置文件的生效方式。全部命令与回显均在 Ubuntu 22.04 + BlazingMQ v0.95.20 单节点环境实测取得(部署形态见《Ubuntu 22.04 部署 BlazingMQ 0.95.20 指南》,版本与选型背景见 《BlazingMQ 介绍与选型指南》)。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS;
- 软件版本:BlazingMQ v0.95.20(2026-08-24 官方 git tag,2026-10-23 查询);
- 部署形态:官方单节点 compose 模板(服务
bmqbrkr+bmqtool),代理配置目录挂载到容器内/etc/local/bmq,数据目录/var/local/bmq; - 组件与二进制:
bmqbrkr(消息代理)、bmqtool(官方 CLI,与代理同镜像分发,路径/usr/local/bin/bmqtool); - 代理监听端口:30114(BMQP 二进制协议),宿主机映射为 8134。
二、工具概览
BlazingMQ 的命令行工具链由两个程序组成,均随官方镜像或源码构建一并分发:
| 程序 | 角色 | 典型用途 |
|---|---|---|
bmqbrkr | 消息代理主程序 | 前台启动代理、指定配置目录、查看版本 |
bmqtool | 官方 CLI 多模式工具 | 交互收发消息、自动化压测(auto)、存储文件离线检查(storage)、系统检查(syschk) |
2.1 bmqtool 的四种运行模式
bmqtool --help 实测回显(节选):
Usage: bmqtool [--mode <mode>] [-b|broker <address>] [-q|queueuri <uri>]
[-f|queueflags <flags>] [-l|latency <latency>]
[--latency-report <report.json>] [-d|dumpmsg] [-c|confirmmsg]
[-e|eventsize <evtSize>] [-m|msgsize <msgSize>]
[-r|postrate <rate>] [--eventscount <events>]
[-u|maxunconfirmed <unconfirmed>] [-i|postinterval <interval>]
[-v|verbosity <verbosity>] [--logFormat <logFormat>]
[-D|memorydebug] [-t|threads <threads>]
[--shutdownGrace <shutdownGrace>] [--nosessioneventhandler]
[-s|storage <storage>] [--log <log>] [--profile <profile>]
[-h|help] [--dumpprofile]
[--messagepattern <sequential message pattern>]
[--messageProperties <MessageProperties>]
[--subscriptions <Subscriptions>]
[--autoPubSubModulo <autoPubSubModulo>] [--timeout <timeout>]
[--authnMechanism <mechanism>] [--authnData <data>]
Where:
--mode <mode>
mode ([<cli>, auto, storage, syschk])
-b | --broker <address>
address and port of the broker (default: tcp://localhost:30114)
(--help 退出码为 1,属工具设计如此;完整帮助以本地 bmqtool --help 输出为准。)
四种模式的分工:
| 模式 | 进入方式 | 用途 |
|---|---|---|
cli(默认) | bmqtool -b tcp://<代理>:30114 | 交互式 REPL,逐条执行 start/open/post/list/confirm 等命令 |
auto | --mode auto -q <队列URI> -f <flags> | 自动化生产者/消费者,按 --eventscount/--postrate 批量收发 |
storage | bmqtool --mode storage | 离线打开代理存储文件(qlist/journal/data),检查队列与记录 |
syschk | bmqtool --mode syschk -q <队列URI> | 系统连通性检查 |
2.2 代理侧与容器形态下的调用入口
官方单节点 compose 模板中 bmqtool 服务本身即时退出,仅作为与代理同网络的"工具跳板"存在(官方注释原文:"This 'service' will exit immediately... to be started in interactive mode with docker-compose run")。因此命令行操作统一从工具服务发起,本文全部示例采用两种等价形态之一:
# 形态一:一次性管道驱动(本文实测采用,输出可留存)
docker compose run --rm -T bmqtool bash -c 'printf "start\nbye\n" | bmqtool -b tcp://bmqbrkr:30114'
# 形态二:交互式 REPL
docker compose run --rm bmqtool bmqtool -b tcp://bmqbrkr:30114
三、前置条件
- 代理已在运行(部署过程见《Ubuntu 22.04 部署 BlazingMQ 0.95.20 指南》):
$ docker compose ps bmqbrkr
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
blazingmq-09520-bmqbrkr bmqbrkr:latest "/usr/local/bin/bmqbr…" bmqbrkr 2 minutes ago Up 2 minutes 0.0.0.0:8134->30114/tcp, [::]:8134->30114/tcp
- 代理端口监听确认(宿主机侧):
$ ss -ltn | grep 8134
LISTEN 0 4096 0.0.0.0:8134 0.0.0.0:* users:(("docker-proxy",pid=21460,fd=4))
- 默认域
bmq.test.persistent.priority已随官方配置加载(队列qqq无需预建,首次 open 时自动创建)。
四、bmqbrkr 代理命令详解
4.1 命令行语法与版本查看
bmqbrkr 传入无法识别的参数即可触发官方 usage 打印(实测 --badoption):
PANIC [STARTUP] Failed to parse command line
Usage: bmqbrkr [-i|instanceId <instanceId>] [-h|hostName <hostName>]
[-t|hostTags <hostTags>] [-d|hostDataCenter <hostDataCenter>]
[-p|port <port>] [-v|version] [<config>]
Where:
-i | --instanceId <instanceId>
The instance ID ('default' if not provided)
-h | --hostName <hostName>
Override host name
-t | --hostTags <hostTags>
Override host tags
-d | --hostDataCenter <hostDataCenter>
Override host data center
-p | --port <port>
Override port
-v | --version
Show broker version number
要点:
bmqbrkr没有--help长选项,直接传--help会以PANIC退出(用法查看见上);<config>位置参数是配置目录路径,官方 compose 中即/etc/local/bmq;- 版本查看实测:
$ bmqbrkr -v
BlazingMQ broker version: BLP_LIB_BMQBRKR_99.99.99
回显中的 99.99.99 是因为官方示例配置 clusters.json 将 brokerVersion 设为 999999,代理对外通告该值;源码版本以构建所用 git tag(v0.95.20)为准。
4.2 启动与停止
compose 形态下代理由服务编排托管,启动/停止命令:
$ docker compose up -d bmqbrkr # 启动
$ docker compose stop bmqbrkr # 优雅停止
$ docker compose start bmqbrkr # 再次启动
优雅停止时代志实录(docker logs 节选):
STOPPING bmqbrkr [pid: 1]
23OCT2026_12:12:12.079 INFO mqba_application.cpp:490 : Executing GRACEFUL_SHUTDOWN_V2
代理收到 SIGTERM 后执行 GRACEFUL_SHUTDOWN_V2,集群状态落盘后退出,再次启动会从既有存储恢复(Cluster (local): Received state-restore event for Partition [0])。
4.3 进程级运行参数(hostName 等)
-h 可覆盖主机名。实测环境容器 hostname 为 gallifrey,而代理配置与工具容器主机名为 earth,代理日志与 GUID 生成均显示 hostname: 'earth',单节点收发不受影响;但多节点集群部署时各节点主机名必须与 clusters.json 中登记的节点名一致,否则选举与节点互认失败。
4.4 直接前台运行(排障用)
排查配置问题时可绕过编排直接前台启动,实测无参运行会因缺少 <config> 立即报错退出:
Error: No value supplied for the non-option argument "config."
正确形态即 compose 中的 command:
bmqbrkr /etc/local/bmq
五、bmqtool 交互模式命令详解
5.1 命令总览
交互模式(默认 cli)进入后出现欢迎语,键入 help 查看命令清单:
Welcome to the BlazingMQ tool.
Type 'help' to see the list of commands. Crl-D to quit.
核心命令一组(官方 README 同款语义,全部实测):
| 命令 | 语法 | 作用 |
|---|---|---|
start | start | 建立到代理的会话 |
open | open uri="<队列URI>" flags="read,write,ack" | 打开队列(读/写/确认),首次打开自动建队 |
post | post uri="<队列URI>" payload=["<内容>"] | 发送一条消息 |
list | list | 列出本会话尚未确认(unconfirmed)的消息 |
confirm | confirm uri="<队列URI>" guid="<GUID>" | 确认消费指定 GUID 的消息 |
batch-post | batch-post uri="<队列URI>" payload=["..."] eventsCount=N ... | 批量发送,支持自增消息属性 |
close | close uri="<队列URI>" | 关闭队列 |
stop | stop | 结束会话 |
bye / quit / q | — | 退出工具 |
5.2 单会话收发闭环(start → open → post → list → confirm)
一次性脚本实测(同一会话既生产又消费):
docker compose run --rm -T bmqtool bash -c '{
printf "start\n"; sleep 1
printf "open uri=\"bmq://bmq.test.persistent.priority/qqq\" flags=\"read,write,ack\"\n"; sleep 1
printf "post uri=\"bmq://bmq.test.persistent.priority/qqq\" payload=[\"hello world\"]\n"; sleep 2
printf "list\n"; sleep 1
printf "confirm uri=\"bmq://bmq.test.persistent.priority/qqq\" guid=\"<上一步list中的GUID>\"\n"; sleep 1
printf "stop\nbye\n"
} | bmqtool -b tcp://bmqbrkr:30114'
关键实测回显(日志节选,时间戳省略):
--> Starting session: [ async = false ]
--> Opening queue: [ uri = "bmq://bmq.test.persistent.priority/qqq" flags = "read,write,ack" ... ]
<-- session.openQueueSync() => SUCCESS ([ queueId = [ uri = bmq://bmq.test.persistent.priority/qqq ... ] result = "SUCCESS (0)" ])
--> Posting message: [ uri = "bmq://bmq.test.persistent.priority/qqq" payload = [ "hello world" ] ... ]
<-- session.post() => SUCCESS (0)
Unconfirmed message listing: 1 messages
# 1 [40000000000067922389446D298A1314] Queue: '[ uri = bmq://bmq.test.persistent.priority/qqq ... ]' = 'hello world'
--> Confirming message with GUID 40000000000067922389446D298A1314
<-- session.confirmMessage() => SUCCESS (0)
Unconfirmed message listing: 0 messages
会话结束时工具打印统计表(节选):
#### stats [delta = last 300 seconds] ####
| messages| events| bytes
---------+---------+-------+------
PUT | 1| 1| 56 B
PUSH | 1| 1| 60 B
ACK | 1| 1| 36 B
CONTROL| | 3| 216 B
CONFIRM| | |
5.3 跨会话生产消费闭环(两个工具会话)
真实的"生产者/消费者"分离场景:先起消费者会话(open 后等待),再起生产者会话发送,观察消费者收到 PUSH 并确认。
消费者会话(等待收消息):
docker compose run --rm -T bmqtool bash -c '{
printf "start\n"; sleep 1
printf "open uri=\"bmq://bmq.test.persistent.priority/qqq\" flags=\"read,write,ack\"\n"; sleep 6
printf "list\nconfirm uri=\"bmq://bmq.test.persistent.priority/qqq\" guid=\"<GUID>\"\nstop\nbye\n"
} | bmqtool -b tcp://bmqbrkr:30114'
生产者会话(发送 msg-from-producer-42):
docker compose run --rm -T bmqtool bash -c '{
printf "start\n"; sleep 1
printf "open uri=\"bmq://bmq.test.persistent.priority/qqq\" flags=\"read,write,ack\"\n"; sleep 1
printf "post uri=\"bmq://bmq.test.persistent.priority/qqq\" payload=[\"msg-from-producer-42\"]\n"; sleep 2
printf "stop\nbye\n"
} | bmqtool -b tcp://bmqbrkr:30114'
消费者侧实测回显(节选):
==> EVENT received: [ type = "MESSAGE" rawEventType = PUSH ]
Unconfirmed message listing: 1 messages
# 1 [400000000000779F034AE97AC5EB12B1] Queue: '[ uri = bmq://bmq.test.persistent.priority/qqq ... ]' = 'msg-from-producer-42'
--> Confirming message with GUID 400000000000779F034AE97AC5EB12B1
<-- session.confirmMessage() => SUCCESS (0)
消费端统计确认跨会话投递成功:
PUT | | |
PUSH | 1| 1| 72 B
CONFIRM| 1| 1| 36 B
5.4 批量发送 batch-post 与自增消息属性
batch-post 按 eventsCount/postInterval/postRate 控制节奏,autoIncremented 为每条消息附加一个自增整型属性。官方示例参数形态实测:
docker compose run --rm -T bmqtool bash -c '{
printf "start\n"; sleep 1
printf "open uri=\"bmq://bmq.test.persistent.priority/qqq\" flags=\"read,write,ack\"\n"; sleep 1
printf "batch-post uri=\"bmq://bmq.test.persistent.priority/qqq\" payload=[\"sample message\"] eventsCount=5 postInterval=100 postRate=10 autoIncremented=\"x\"\n"; sleep 3
printf "list\n"; sleep 1
printf "confirm uri=\"bmq://bmq.test.persistent.priority/qqq\" guid=\"*\"\n"; sleep 1
printf "stop\nbye\n"
} | bmqtool -b tcp://bmqbrkr:30114'
实测回显(节选)——list 能看到消息携带自增属性 x:
All messages have been posted
Unconfirmed message listing: 2 messages
# 1 [400001000000773C09BF3652A42FD224] Queue: '[ uri = bmq://bmq.test.persistent.priority/qqq ... ]' = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF', with properties: [ x (INT64) = 1 ]
# 2 [400003000000773C5D833652A42FD224] Queue: '[ uri = bmq://bmq.test.persistent.priority/qqq ... ]' = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF', with properties: [ x (INT64) = 3 ]
--> Confirming message with GUID 400001000000773C09BF3652A42FD224
<-- session.confirmMessage() => SUCCESS (0)
--> Confirming message with GUID 400003000000773C5D833652A42FD224
<-- session.confirmMessage() => SUCCESS (0)
说明两点:
- payload 未指定内容时,工具以
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF为模板填充到默认msgSize(1024 字节); - 上述
list时刻列出了 2 条未确认消息(属性 x=1、x=3),代理侧统计PUT 5条已全部入库,未确认列表是滚动快照——这正是"先 list 拿 GUID 再 confirm"要在同一节奏内完成的原因。统计表(节选):
PUT | 5| 5| 5.35 KB
PUSH | 2| 1| 4.28 KB
ACK | 5| 2| 144 B
CONFIRM| 2| 2| 72 B
confirm guid="*" 可一次确认本会话全部未确认消息(实测回显逐条 confirmMessage() => SUCCESS (0))。
5.5 自定义域队列收发(域即配置文件的实操入口)
BlazingMQ 没有运行时"建域"命令:域由配置目录 domains/*.json 定义,重启代理加载。实测新建 bmq.demo.persistent.workqueue 域(配置要点:storageDomain fileBacked、routing priority、maxConsumers 1,配置文件内容详见《BlazingMQ 0.95.20 配置参数详解》)后,重启代理日志确认加载:
Configuration loaded
随后对自定义域队列 demoq 的收发与默认域完全同构:
--> Opening queue: [ uri = "bmq://bmq.demo.persistent.workqueue/demoq" flags = "read,write,ack" ... ]
<-- session.openQueueSync() => SUCCESS ([ queueId = [ uri = bmq://bmq.demo.persistent.workqueue/demoq ... ] result = "SUCCESS (0)" ])
--> Posting message: [ uri = "bmq://bmq.demo.persistent.workqueue/demoq" payload = [ "hello workqueue domain" ] ... ]
<-- session.post() => SUCCESS (0)
Unconfirmed message listing: 1 messages
# 1 [400000000000773A77DABC7D89F46E62] Queue: '[ uri = bmq://bmq.demo.persistent.workqueue/demoq ... ]' = 'hello workqueue domain'
<-- session.confirmMessage() => SUCCESS (0)
5.6 常用启动参数速查
以下参数均来自 bmqtool --help 实测输出,交互模式与 auto 模式共用:
| 参数 | 说明(默认值) |
|---|---|
-b, --broker <address> | 代理地址,默认 tcp://localhost:30114 |
-q, --queueuri <uri> | auto/syschk 模式的队列 URI |
-f, --queueflags <flags> | auto 模式打开队列的 flags |
-m, --msgsize <bytes> | 消息负载大小(1024) |
-e, --eventsize <n> | 每事件消息数(1) |
-r, --postrate <rate> | 每个 postinterval 发送的事件数(1) |
-i, --postinterval <ms> | 发送间隔毫秒(1000) |
--eventscount <events> | 发送事件总数,后缀 s 表示秒数(0 为不限) |
-u, --maxunconfirmed <msgs:bytes> | 未确认消息上限(1024:33554432) |
-v, --verbosity <级别> | 日志级别(info),可选 silent/trace/debug/info/warning/error/fatal |
-t, --threads <threads> | 处理线程数 |
--shutdownGrace <seconds> | auto 模式无消息活动后自动退出 |
-d, --dumpmsg | 打印收到消息的内容 |
-c, --confirmmsg | 收到消息自动确认 |
六、bmqtool storage 模式:存储文件离线检查
storage 模式直接读取代理数据目录中的三件套存储文件(*.bmq_qlist / *.bmq_journal / *.bmq_data),不连接代理也能检查,适合停机窗口做数据体检。
6.1 进入与 help
$ docker compose exec bmqbrkr bmqtool --mode storage
Welcome to the BlazingMQ tool storage inspector.
Type 'help' to see the list of commands supported by storage inspector. Ctrl-D to quit.
> help
Commands:
open path=""
close
queues
metadata
dump uri="" (deleted=false) (messages=false)
help
quit
bye
Data Commands:
d n/next=1
d p/prev=1
d r/record=1
d l/list=1
Qlist Commands:
q n/next=1
q p/prev=1
q r/record=1
q l/list=1
Journal Commands:
j n/next=1
j p/prev=1
j r/record=1
j l/list=1
j type={"message", "confirm", "delete", "qop", "jop"}
j dump="payload"
6.2 open 打开存储(path 通配三件套)
open 必须携带 path 参数,值以 * 结尾时同时打开前缀匹配的三类文件。实测(代理数据目录 /var/local/bmq/storage/):
> open path="/var/local/bmq/storage/bmq_0.20261023_115551*"
Data file: [/var/local/bmq/storage/bmq_0.20261023_115551.bmq_data] Journal file: [/var/local/bmq/storage/bmq_0.20261023_115551.bmq_journal] Qlist file: [/var/local/bmq/storage/bmq_0.20261023_115551.bmq_qlist]
Reading qlist file.
Finished reading qlist file with rc: -4
注意:不带参数的裸 open 直接报错 Invalid path provided in command.(实测)。
6.3 queues:队列实例清单
> queues
Total number of queue instances: 2
Queue #1
Queue URI : bmq://bmq.demo.persistent.workqueue/demoq
QueueKey : 4F47AF2F32
Number of AppIds : 1
AppId #1
AppId : __default
AppKey : 3000000000
Queue #2
Queue URI : bmq://bmq.test.persistent.priority/qqq
QueueKey : FDEAF02193
Number of AppIds : 1
AppId #1
AppId : __default
AppKey : 3000000000
实测环境两个队列实例(默认域 qqq 与自定义域 demoq)都在册,各含一个 __default AppId。
6.4 metadata:三类文件头与日志同步点
> metadata
Details of data file:
BlazingMQ File Header
Protocol Version : 1
Bitness : 64
FileType : DATA
HeaderWords : 8
PartitionId : 0
Data File Header:
HeaderWords : 2
FileId (FileKey) : 0000000000
Details of qlist file:
BlazingMQ File Header
Protocol Version : 1
Bitness : 64
FileType : QLIST
HeaderWords : 8
PartitionId : 0
Qlist File Header:
HeaderWords : 1
Details of journal file:
BlazingMQ File Header
Protocol Version : 1
Bitness : 64
FileType : JOURNAL
HeaderWords : 8
PartitionId : 0
Journal File Header:
HeaderWords : 3
RecordWords : 15
...
Journal SyncPoint:
Last Valid Record Offset : 2804
Record Type : JOURNAL_OP
Record Timestamp : 23OCT2026_12:17:36.000000
SyncPoint SeqNum : 1
SyncPoint Primary NodeId : 0
SyncPoint Primary LeaseId : 5
...
(节选;Journal SyncPoint 段是集群恢复位点,单节点环境下 Primary NodeId 恒为 0。)
6.5 q/j/d 记录游标命令
q(qlist)、j(journal)、d(data)三组游标命令语法一致:n/next、p/prev、r/record、l/list。实测列举 journal 前 2 条记录:
> j l 2
Record Index: 0, Record Type: JOURNAL_OP
Record Index: 1, Record Type: QUEUE_OP
j type 可按类型跳转(message/confirm/delete/qop/jop),j dump="payload" 需 data 文件已打开,用于打印当前 message 记录的负载。
七、注意事项
- post 后立即 list 可能是 0 条:消息事件经代理回推存在毫秒级异步延迟,实测连发时
Unconfirmed message listing: 0 messages,间隔 1~2 秒后 list 即可见。脚本化操作务必在 post 与 list/confirm 之间保留sleep 1以上间隔。 - confirm 必须使用当前会话 list 输出的 GUID:实测用早前会话遗留的旧 GUID 确认会得到
'4000000000000051C1983CA2D36B3E43' NOT found,消息仍在未确认列表中。GUID 换会话即失效,先 list 后 confirm 是固定动作。 - batch-post 参数要用官方示例形态:实测把
msgSize=3 eventSize=3 eventsCount=1与payload=[...]自行组合会让工具进入长时间等待;采用payload=[...] eventsCount=N postInterval=P postRate=R(可加autoIncremented="x")组合稳定。 - bmqbrkr 不支持
--help:传--help以 PANIC 退出。看版本用-v,看用法传一个非法参数触发 usage 打印。 - storage 模式 open 必须带
path:裸open报Invalid path provided in command.;path 以*结尾可一次打开同前缀三件套。 - 脚本杀进程避免 pkill -f 自匹配:
pkill -f "bmqbrkr.tsk"会把命令行里含同关键字的包装脚本一并杀掉(实测脚本因此无输出退出);应按精确进程名匹配(如pkill -x bmqbrkr.tsk)。 - storage 检查不要求代理在线:三件套文件为普通磁盘文件,停机窗口亦可离线检查;代理运行时读取仅作只读观察,不产生写入。
八、常见问题
Q1:bmqbrkr --help 为什么直接 PANIC?
代理命令行解析不含 help 长选项,非法参数统一走 PANIC [STARTUP] Failed to parse command line 并打印 usage。这是官方设计而非故障,用法以 usage 输出与官方文档为准。
Q2:post 返回 SUCCESS,为什么 list 是 0 条?
post 的 SUCCESS 表示消息已提交代理(并收到 ACK 事件),而 list 展示的是经 PUSH 事件回推到本会话的未确认快照,两者异步。保留 1~2 秒间隔再 list(详见 §七.1)。
Q3:confirm 报 'xxx' NOT found?
GUID 不属于当前会话当前未确认集合——多为复用了旧会话/旧消息的 GUID。重新 list 取最新 GUID 再确认。
Q4:open/post 报 'uri' is mandatory 或 Invalid scheme: uri must start with "bmq://"?
命令参数缺失或格式错误:uri= 必填且必须是完整队列 URI(bmq://<域名>/<队列名>)。管道驱动时注意引号转义,建议外层单引号包裹整体脚本、内层转义双引号。
Q5:storage 模式下 q l/j l 报 You must open a qlist file to use that command.?
游标命令依赖已打开的对应文件。先执行 open path="<存储文件前缀>*" 成功(回显三件套路径)后再使用 q/j/d 命令。
Q6:队列需要预先"创建"吗?
不需要独立命令。队列在其所属域的策略下于首次 open 时自动创建并分配 QueueKey(storage 模式 queues 可见);域本身则由 domains/*.json 配置文件定义、重启代理生效(见 §5.5 与《BlazingMQ 0.95.20 配置参数详解》)。
九、参考链接
- 官方仓库:https://github.com/bloomberg/blazingmq(v0.95.20,2026-10-23 查询)
- bmqtool 官方说明:仓库内
src/applications/bmqtool/README.md - 官方单节点部署模板:仓库内
docker/single-node/ - 本专栏相关文档:《BlazingMQ 介绍与选型指南》、《Ubuntu 22.04 部署 BlazingMQ 0.95.20 指南》、《BlazingMQ 0.95.20 配置参数详解》