BlazingMQ 介绍与选型指南

Bloomberg 开源 C++ 分布式消息队列 BlazingMQ 认知篇:定位、架构、队列类型与特性,及与 RabbitMQ/Kafka/NATS 的逐维度量化选型对比(信息溯源日期 2026-10-23)。

BlazingMQ消息队列与流处理2026/10/23

BlazingMQ 介绍与选型指南

目标:讲清 Bloomberg 开源分布式消息队列 BlazingMQ 的定位、架构、队列类型与核心特性,并与 RabbitMQ、Apache Kafka、NATS 做逐维度量化选型对比。本文为认知篇,全部信息来自官方文档与仓库的联网溯源,关键事实均在正文标注来源与查询日期(查询日期统一为 2026-10-23)。

一、环境信息

本文是认知篇(A1),不含本地实测,全部结论来自下列公开来源的联网溯源,均为 2026-10-23 查询当日口径:

  • 官方文档站:https://bloomberg.github.io/blazingmq(含概念、部署、特性、对比、性能等章节);
  • 官方仓库:https://github.com/bloomberg/blazingmq(README、git tags、LICENSE);
  • 官方《Comparison With Alternative Systems》:https://bloomberg.github.io/blazingmq/docs/introduction/comparison/(BlazingMQ 官方对 RabbitMQ 与 Apache Kafka 的逐维度对比,是本文第七章的主要依据);
  • 星数取证:shields.io 徽章 img.shields.io/github/stars/bloomberg/blazingmq(2026-10-23 实抓 HTML,读取为 3.2k);
  • 版本取证:仓库 git tags 页(2026-10-23 实抓,最新 tag 为 v0.95.20,打于 2026-08-24;官方仓库不使用 GitHub Releases 发布二进制,版本以 git tag 为准);
  • 第三方技术评述:Andy Pearce《BlazingMQ: Introduction》(2024 年 6 月,https://www.andy-pearce.com/blog/posts/2024/Jun/blazingmq-introduction/)。

💡 说明:BlazingMQ 官方仓库不提供 GitHub Releases(截至 2026-10-23,Releases 页面为空),版本号只能通过 git tags 确认。这一点与 Kafka、NATS 等习惯在 Releases 页挂二进制的项目不同,选型与升级时应以 tags 和源码构建为主。

二、软件概述

BlazingMQ 是 Bloomberg 于 2024 年初开源的分布式消息队列框架(官方 README 口径),聚焦于效率、可靠性与面向现代工作流的丰富特性。其核心后端(消息代理 bmqbrkr)使用 C++ 实现,官方提供 C++、Java、Python 三种客户端库——其中 Java 与 Python 客户端分别维护在独立仓库 bloomberg/blazingmq-sdk-java 与 bloomberg/blazingmq-sdk-python,本仓库(bloomberg/blazingmq)包含消息代理、C++ 客户端库与命令行工具 bmqtool(来源:官方 README,2026-10-23 查询)。

关键身份信息一览(均为官方来源,2026-10-23 查询):

维度事实来源
开源许可Apache License 2.0仓库 LICENSE
实现语言代理端 C++,客户端 C++/Java/Python官方 README
通信协议BMQP(BlazingMQ 二进制协议,语义与 AMQP 类似,官方文档口径)官方文档
默认监听端口30114(TCP)官方部署文档
生产检验在 Bloomberg 生产环境运行 8 年以上(开源时口径)官方 README
最新版本v0.95.20(tag 打于 2026-08-24)git tags,2026-10-23 查询
社区规模GitHub Star 约 3.2kshields.io 徽章,2026-10-23 抓取
部署形态官方提供 Docker 镜像构建与 docker compose 编排(单节点/集群两套模板),亦提供 Ubuntu 22.04 源码构建脚本 bin/build-ubuntu.sh官方 README 与部署文档

💡 技术拓展:消息中间件常见的「消息模型」有三种——队列语义(消息被消费确认后出队,不可回放,代表 RabbitMQ、BlazingMQ)、日志语义(commit log/分区 + 消费者 offset,可回放重读,代表 Kafka、Pulsar)、发布订阅语义(轻量主题订阅,默认不持久化,代表 core NATS;NATS 通过 JetStream 补齐持久化流)。BlazingMQ 属于第一种:消息只在被消费确认前保留,消费者不能回到过去重读历史消息(官方对比文档明确此点)。本文第七章将沿此差异展开量化对比。

三、核心架构

依据官方文档(架构与对比章节,2026-10-23 查询),BlazingMQ 的架构要点如下:

  1. 集群与节点:一个 BlazingMQ 集群(cluster)由一个或多个 broker 节点组成,管理一组域(domain)。单节点集群换来更好的速度,多节点集群换来可用性与容错。
  2. 域(domain)与队列(queue):队列打开在域之下,域定义队列的默认配置(存储介质、路由模式、一致性级别等)。队列无需预先声明——首次被 open 时自动创建(官方快速上手文档口径)。队列 URI 形如 bmq://bmq.test.persistent.priority/my-first-queue,其中 bmq.test.persistent.persistent.priority 这类中间段即域的名字。
  3. 存储模型:BlazingMQ 先存储后路由(store-then-route):消息先落盘并复制,再向各消费者分发。因此存储与复制的成本与扇出比(fan-out ratio)无关,扇出 50+ 消费者时相比 RabbitMQ「每队列各存一份」可节省约 50 倍存储(官方对比文档《Storage Savings》一节的量化结论)。磁盘上消息不是立即删除,而是标记删除,整个日志文件集达到上限且其中消息全部确认后整体回收。
  4. 复制与一致性:集群内每个节点都保有全量数据副本(复制因子等于集群大小),支持强一致复制——生产者在集群 N 个节点接受消息后收到成功确认,N 可配置;官方声明 BlazingMQ 通过了基于 Jepsen 构建的混沌测试(官方对比文档《Fault Tolerance》一节,2026-10-23 查询)。
  5. 代理节点(proxy):这是官方强调的独有特性——应用可以选择连接到代理节点而非直接连集群节点。代理不参与存储与复制,但参与路由,并为核心节点构成一棵以队列主节点为根的分布树(distribution tree),大扇出场景下主节点的直接扇出可以从数千级降到数十级(官方对比文档举例:N=5000 消费者、M=1000 msg/s 的场景,出向聚合 500 万 msg/s,借助分布树主节点只需承受约 10 级扇出)。代理还能为核心与集群间的瞬时网络故障提供缓冲与重传。
  6. 对其他系统的依赖:官方对比文档明确 BlazingMQ 不依赖任何其他软件框架(无 ZooKeeper 类元数据依赖,也不依赖 JVM/Erlang VM),自管数据与元数据。

四、功能特性

综合官方 README、特性文档与域配置定义(2026-10-23 查询):

  • 多种路由策略:work queue(工作队列,多消费者争抢)、priority(优先级队列)、fanout(扇出队列)、broadcast(广播队列);官方对比文档确认 broadcast 为 BlazingMQ 独有的「至多一次」路由策略——消息不落盘、不缓冲、立即分发给当时在线的消费者后即丢弃,换来比其他策略更好的延迟与吞吐(官方性能基准页有对应专项数据)。
  • 消息属性与过滤路由:消息由载荷(payload)加可选属性(properties)组成;支持基于表达式的主题式路由(topic-based routing),按条件把数据流切成动态的逻辑子流。
  • 一致性级别可选:域配置支持 eventual(最终一致)与 strong(强一致)等一致性档位,同一系统内可按数据流的重要程度混布不同保障级别(官方对比文档《Mixed workload》场景)。
  • 存储介质可选:域可配置为持久化(persistent,落盘日志)或内存(inMemory)。
  • 消息压缩:官方 README 列明支持压缩。
  • 毒丸检测(poison pill detection):自动识别反复投递失败的毒消息(官方 README)。
  • 消费者优先级:同一队列上可声明消费者优先级,高优先级消费者在线时消息优先流向它,实现应用侧的故障转移(官方对比文档;Kafka 不支持消费者优先级)。
  • 去重窗口:域参数含 deduplicationTimeMs(默认 300000ms),为生产者提供去重窗口。
  • 监控与度量:内置统计(stat)输出与快照机制,官方提供 Prometheus 插件(编译期可选),暴露 queue_producers_count、queue_consumers_count 等指标(官方插件文档)。

五、快速开始(最小可用示例)

本节为官方文档流程的转述(来源:官方《BlazingMQ in Action》与《Deployment》文档,2026-10-23 查询;本文作者在 B1 部署篇中对该流程做了全量实测复现,可参阅本专栏部署篇),最小可用路径如下:

  1. 克隆仓库并从仓库根目录启动官方单节点集群模板:
git clone https://github.com/bloomberg/blazingmq.git
cd blazingmq
docker compose -f docker/single-node/docker-compose.yaml up --build -d
  1. 官方模板会在同一网络内再起一个 bmqtool 环境,进入并连接代理(代理默认监听 30114 端口):
docker compose -f docker/single-node/docker-compose.yaml run bmqtool
bmqtool -b tcp://bmqbrkr:30114
  1. 在 bmqtool 的 REPL 中开一个会话、打开队列、投递并确认消息(以下为官方文档原文示例):
> start
> open uri="bmq://bmq.test.persistent.priority/my-first-queue" flags="read,write,ack"
> post uri="bmq://bmq.test.persistent.priority/my-first-queue" payload=["hello world"]
> list
> confirm uri="bmq://bmq.test.persistent.priority/my-first-queue" guid="40000000001068A4B4B275EDF7D3228F"

要点:open 时若队列不存在会自动创建;以 read+write 打开时自己 post 的消息会被回显给自己,list 可列出未确认消息,confirm 按 GUID 确认后消息出队。这一套 start/open/post/list/confirm 即 BlazingMQ 的最小可用闭环。

六、适用场景与限制

官方列举的优势场景(来源:官方对比文档《BlazingMQ Use Cases》一节,2026-10-23 查询,这也是 Bloomberg 内部场景的抽象):

  1. 高扇出 + 高数据量:数千消费者各取全量数据时,借助分布树与「先存后路由」,主节点压力与带宽开销被大幅压低(官方给出 N=5000、M=1000、出向聚合 500 万 msg/s 的算例);
  2. 存储敏感:扇出 50+ 的队列相比 RabbitMQ 约节省 50 倍存储;
  3. 海量动态队列:队列创建廉价、无需预声明、可长可短,适合用大量细粒度队列做数据流治理;
  4. 混合负载:同一系统内按数据流重要性混布强一致/最终一致、持久/内存、独占/扇出等保障级别;
  5. 特性-性能-可靠性的组合均衡:官方定位是「简洁、性能、容错与特性的独特组合」。

明确限制(同样来自官方对比文档,选型时务必对照):

  • 不可回放:消息确认后即不可再读,没有 Kafka 式的 offset 回溯能力;
  • 集群规模固定:复制因子=集群大小,加减节点需要全集群重启并伴随运维开销,扩节点增加的是可用性而非吞吐/容量(Kafka 则相反);
  • 需要预先知道扇出比:「先存后路由」要求系统提前知道扇出拓扑;
  • 生态与客户端广度:客户端目前为 C++/Java/Python 三种(相对 Kafka/RabbitMQ 的语言矩阵偏窄);社区体量(约 3.2k Star,2026-10-23)小于三大竞品;
  • 不使用 GitHub Releases:二进制分发以源码构建与官方 Docker 路径为主,对习惯 RPM/DEB 官方仓库的团队要多一步评估。

七、同类选型对比

7.1 官方逐维度对比(vs RabbitMQ / Kafka)

下表浓缩自官方《Comparison With Alternative Systems》(2026-10-23 查询),这是目前最权威的一手对比材料:

维度BlazingMQRabbitMQApache Kafka
消息生命周期消费确认前保留,确认后不可回读同左(消息出队即不可回读)日志保留策略驱动,消费者可 rewind/replay
存储与路由次序先存储后路由,存储成本与扇出比无关先经 Exchange 路由后存队列,成本随路由目的地增长存储与路由解耦(分区 + 消费组)
负载均衡方式消费者显式 attach 到队列,round-robin 模式下加消费者即扩处理能力同左消费组按分区分配,消费者数>分区数时新消费者空闲;扩吞吐要加分区
消费者优先级支持(高优先级在线时消息优先流向)支持(大流量时高优先级在场也可能溢到低优先级)不支持
主题式过滤路由支持(表达式过滤)支持(binding key 等)依赖外部(Kafka Streams/客户端侧过滤)
广播(至多一次)原生 broadcast 策略,官方称为独有,延迟/吞吐优于其他策略需自行建模无对等物(消费者各自读全量日志属不同语义)
集群扩缩固定成员,扩容需全集群重启,复制因子=集群大小运行时可变规模,队列级可配复制策略节点扩容即增容量,副本数与集群规模解耦
外部依赖无(自管元数据,非 JVM/Erlang)依赖 Erlang VM传统依赖 ZooKeeper(官方口径:正在移除中),运行于 JVM
代理层(proxy)原生代理节点 + 分布树,独有无无
一致性验证官方声明通过 Jepsen 混沌测试经典镜像队列有 Jepsen 分区丢一致性记录(官方引用 aphyr 结论),v3.8 起提供基于 Raft 的 quorum queue强一致写依赖 acks/副本配置

关键解读:官方刻意不给「选谁」的结论,三者在不同维度互有胜负。从表中最可操作的差异看:需要回放历史 → Kafka;需要成熟生态与多协议 → RabbitMQ;需要大扇出低冗余、强一致队列语义、独有广播策略且接受 C++/Java/Python 客户端矩阵 → BlazingMQ。

7.2 扩展到 NATS 的四系统对比

NATS 不在官方对比文档范围内,下表按各官方文档口径整理(查询日期 2026-10-23):

维度BlazingMQRabbitMQApache KafkaNATS
许可证Apache-2.0MPL-2.0Apache-2.0Apache-2.0
代理实现语言C++Erlang/OTPJava/ScalaGo
协议BMQP(二进制)AMQP 0-9-1(另有 MQTT/STOMP 插件)自有 TCP 协议NATS 文本协议
默认语义队列(at-least-once,确认后不可回放)队列(at-least-once)提交日志(at-least-once,可回放)core 至多一次;JetStream 提供持久化流
至多一次广播原生 broadcast 队列需自行建模非原生core NATS 原生
元数据外部依赖无无ZooKeeper(官方口径:去 ZK 进行中)无
部署体量单二进制 bmqbrkr + JSON 配置Erlang 运行时JVM + 存储单二进制,极轻
客户端语言(官方)C++/Java/Python广(官方多语言客户端)广(社区+官方)广(官方 30+ 语言生态口径)

关键解读:四者的本质分野在语义——「队列」还是「日志」还是「订阅」。若业务需要「消息被处理掉就消失」的记账式队列语义(工单、任务分发、交易后处理),BlazingMQ/RabbitMQ 是同语义竞争者;需要「数据是历史账本、可重算」的流语义,选 Kafka;需要极致轻量的广播/请求响应且能接受 JetStream 补持久化,选 NATS。

7.3 性能与社区活跃度的量化口径

  • BlazingMQ:官方未公布绝对吞吐数字(官方性能页 docs/performance/benchmarks 仅发布相对基准,broadcast 策略延迟/吞吐优于其他策略为官方口径);第三方评述(Andy Pearce,2024-06)引述官方团队的公开基准认为「约 10 万 msg/s 以上可达」,并强调实际取决于配置与负载。Bloomberg 官方对比文档给出的可量化结论是:扇出 50+ 场景约 50 倍存储节省;N=5000/M=1000 的高扇出算例下分布树将主节点扇出降至约 10 级。
  • RabbitMQ:官方不发布统一吞吐基准(性能高度依赖消息大小、确认策略与拓扑,官方文档口径);本站实测经验可参阅 《RabbitMQ 4.3.6 介绍与选型指南》。
  • Kafka:以分区并行实现吞吐线性扩展为官方架构口径,本站选型分析见 《Apache Kafka 4.3.1 介绍与选型指南》。
  • NATS:以低延迟轻量为核心卖点(官方口径),本站部署与分析见 《NATS Server 2.15 介绍与选型指南》。
  • 版本节奏:BlazingMQ 2026 年保持高频补丁节奏(2026-06-17 与 2026-08-24 两天内分别连续打出 v0.95.11~.13、v0.95.15~.20 系列 tag,git tags 页 2026-10-23 抓取),迭代活跃;Java/Python SDK 独立仓库同步维护。
  • 社区体量:约 3.2k Star(shields.io,2026-10-23),明显小于三大竞品(量级为数十 k),属于「Bloomberg 背书、社区中等」的项目形态。

7.4 选型建议(如果……则……)

  • 如果需要队列语义 + 高扇出数据分发 + 存储成本敏感(如行情、事件广播给数千下游)→ BlazingMQ 优势最明显;
  • 如果需要回放/重算历史数据、构建流式管道 → Kafka;
  • 如果需要多协议、成熟管理界面与庞大插件生态的路由型队列 → RabbitMQ;
  • 如果需要极轻量的服务间广播与请求-响应 → NATS(core);
  • 如果团队只维护 C++/Java/Python 技术栈且看重「无外部元数据依赖 + 单二进制部署」→ BlazingMQ 的运维面非常小;
  • 如果预期集群要频繁弹性扩容 → 避免 BlazingMQ(固定成员制),选 Kafka/RabbitMQ。

八、参考链接