ZeroMQ 4.3.5 介绍与选型指南
ZeroMQ(libzmq)4.3.5 介绍与选型指南:消息内核定位、12 种套接字与多传输架构、无 broker 形态、功能特性、官方 Hello World 示例、适用场景限制与同类消息中间件选型对比(信息实查于 2026-10-20)。
ZeroMQ 4.3.5 介绍与选型指南
目标:讲清 ZeroMQ(libzmq 4.3.5)的产品定位、核心架构、功能特性、适用边界与同类消息中间件选型对比,帮助读者判断「该不该用它、用在哪一层」。本文为认知篇,全部信息经联网溯源实查(官方 GitHub 仓库 zeromq/libzmq、Releases Atom 源、发布包内 NEWS/LICENSE/README),信息查询日期为 2026-10-20。
一、环境信息
本篇为认知与选型篇,不涉及本地部署实测,信息来源与取证时间如下:
- 组件名称:ZeroMQ(核心实现库为 libzmq,GitHub 仓库
zeromq/libzmq) - 实查最新稳定版:libzmq 4.3.5,发布于 2023-10-09(来源:GitHub Releases Atom 源
https://github.com/zeromq/libzmq/releases.atom,查询日期 2026-10-20) - 开源许可证:MPL-2.0(Mozilla Public License 2.0;4.3.5 版完成了从 LGPL-3.0+ 到 MPL-2.0 的整体重许可,来源:发布包内
NEWS文件与LICENSE文件) - 社区热度:GitHub Star 约 11k(来源:shields.io 仓库徽章
img.shields.io/github/stars/zeromq/libzmq,查询日期 2026-10-20) - 维护方:ZeroMQ 社区(zeromq.org,由 iMatix 发起并长期主导)
- 官方文档与资料:
- 官网:https://zeromq.org/
- 代码仓库:https://github.com/zeromq/libzmq
- 官方指南(The Guide,aka zguide):https://zguide.zeromq.org/
💡 说明:ZeroMQ 有两个常见指代——广义的 ZeroMQ 项目族(协议 ZMTP、各类语言绑定、周边工具)与狭义的核心库 libzmq。本篇与后续部署/工具篇均以 libzmq 4.3.5 为基准版本。
二、软件概述
ZeroMQ 官方对自身的定义是「轻量级消息内核(lightweight messaging kernel)」:它是一个以库形态交付的异步消息中间件,把传统上由专门消息中间件产品(如 RabbitMQ、Kafka)提供的能力——异步消息队列、多种消息模式、订阅过滤、多传输协议无缝切换——封装进了「套接字(socket)」这一开发者最熟悉的接口里(来源:libzmq 4.3.5 发布包 README.md,实查 2026-10-20)。
理解 ZeroMQ 定位要抓住三个关键词:
- 库,不是服务:libzmq 编译产物是一个 C/C++ 库(
libzmq.so),没有独立守护进程、没有配置文件、没有管理后台。你的应用程序链接它之后,消息能力就内嵌在应用进程里。「部署 ZeroMQ」实质上是「编译/安装这个库 + 上线使用它的应用」。 - 无 Broker(brokerless):ZeroMQ 端点之间可以直接通信(P2P),不需要中心消息服务器。它同时提供
zmq_proxy这样的极简中转构件,可以在需要中心交换点时用几十行代码组装出一个 broker。 - 套接字抽象:同一套 Socket API 上可以切换
inproc(进程内)、ipc(本机进程间)、tcp(跨主机)等传输,代码不需要重写——从单机走向分布式时改一个 URL 即可。
💡 技术拓展:消息中间件的拓扑形态不止「无 Broker」一种,选型前应认识全貌:
形态 原理/特点 代表产品 适用场景 无 Broker(嵌入式) 消息库内嵌进应用,端点直连,无独立进程 ZeroMQ、nanomsg 低延迟、进程间通信、嵌入分布式应用内部 中心 Broker 独立服务器负责路由/存储/投递 RabbitMQ、NATS 系统间解耦、多语言异构集成 分布式日志 消息落盘为分区日志,消费端拉取 Apache Kafka、Pulsar 高吞吐管道、流处理、事件回放 内存 Pub/Sub 复用内存数据库的发布订阅 Redis Pub/Sub 轻量广播、已有 Redis 栈 ZeroMQ 属于第一类「无 Broker 嵌入式」,本文后续选型对比均以此为基点。
版本节奏方面,libzmq 的稳定版发布较慢但极稳:4.3.3 发布于 2020-09-07、4.3.4 发布于 2021-01-17、4.3.5 发布于 2023-10-09(来源:Releases Atom 源实查)。这符合「基础设施库」的演进规律——接口稳定、变更审慎;选型时不必担心频繁破坏性升级,但也要接受「新特性(DRAFT API)落地慢」的现实。
三、核心架构
ZeroMQ 的架构可以概括为「一层套接字抽象 + 三种传输 + 可选中转」。下面分小节拆解。
3.1 套接字类型:消息模式即套接字
ZeroMQ 的核心设计是把消息模式做成套接字类型,稳定 API 共 12 种(来源:libzmq 4.3.5 发布包 include/zmq.h 与官方文档 zmq_socket(3)):
| 套接字类型 | 模式 | 方向 | 典型配对 |
|---|---|---|---|
| REQ | 请求-应答 | 同步双向 | REQ ↔ REP |
| REP | 请求-应答 | 同步双向 | REQ ↔ REP |
| DEALER | 请求-应答拆分 | 异步双向 | DEALER ↔ ROUTER |
| ROUTER | 请求-应答拆分 | 异步双向 | DEALER ↔ ROUTER |
| PUB | 发布-订阅 | 单向广播 | PUB ↔ SUB |
| SUB | 发布-订阅 | 单向订阅 | PUB ↔ SUB |
| XPUB | 订阅扩展(可感知订阅者) | 单向广播 | XPUB ↔ XSUB |
| XSUB | 订阅扩展(转发订阅指令) | 单向订阅 | XPUB ↔ XSUB |
| PUSH | 管道分发(轮询推给下游) | 单向 | PUSH ↔ PULL |
| PULL | 管道汇聚(从上游收) | 单向 | PUSH ↔ PULL |
| PAIR | 独占双工 | 一对一双向 | PAIR ↔ PAIR |
| STREAM | 裸 TCP 流(处理非 ZMTP 对端) | 双向 | STREAM ↔ 任意 |
关键差异与用法:REQ/REP 是「一问一答、必须严格交替」的同步模式;DEALER/ROUTER 是其异步解耦版,配合 zmq_proxy 可构建「多客户端 ↔ 多服务端」的中转层;PUB/SUB 用于广播分发,SUB 端按主题前缀过滤;PUSH/PULL 构成负载均衡的流水线;PAIR 提供最简单的一对一通道;STREAM 用于对接非 ZeroMQ 协议的原始 TCP 流。4.3.5 中还有 RADIO/DISH、SCATTER/GATHER、CLIENT/SERVER 等 DRAFT 状态套接字(默认不编译,需开启 draft API)。
3.2 传输协议与统一端点 URL
ZeroMQ 套接字通过统一格式的端点 URL 绑定/连接,传输层可随意替换(来源:官方文档 zmq_tcp(7)/zmq_ipc(7)/zmq_inproc(7)):
| 传输 | 端点格式 | 范围 | 说明 |
|---|---|---|---|
| inproc | inproc://<名字> | 同一进程内线程间 | 零拷贝级延迟,需共享同一 Context |
| ipc | ipc://<文件路径> | 同一主机进程间 | Unix Domain Socket,如 ipc:///tmp/zmq-demo.ipc |
| tcp | tcp://<地址>:<端口> | 跨主机 | 主力传输,如 tcp://127.0.0.1:5555、tcp://*:5555 |
| pgm/epgm | pgm://... / epgm://... | 跨主机组播 | 可靠组播(需编译支持) |
| vmci | vmci://... | 虚拟机间 | VMware 虚拟化环境 |
同一套业务代码从线程间通信(inproc)扩展到跨主机通信(tcp),只需更换端点字符串,这是 ZeroMQ 区别于大多数中间件的标志性能力。
3.3 运行模型:I/O 线程与消息队列
每个 zmq_ctx_new() 创建的 Context 默认启动一个 I/O 线程,负责所有套接字的后台收发、重连与协议处理;业务线程通过 zmq_send/zmq_recv 与套接字交互,消息先进入内存队列(HWM 高水位控制),由 I/O 线程异步完成网络传输(来源:官方文档 zmq_ctx_set(3)、zmq_socket(7))。由此带来的行为特征:
- 自动重连:对端重启后 ZeroMQ 自动恢复连接,业务代码无感知;
- 消息排队:对端暂时不可达时消息在本地队列缓冲,队列超过 HWM 后按模式丢弃或阻塞;
- 无持久化:队列在内存中,进程退出即失——这是它与 RabbitMQ/Kafka 的本质分野。
3.4 可选中转:zmq_proxy 与 broker 形态
ZeroMQ 不是必须有 broker,但提供了 zmq_proxy(frontend, backend, capture) 构件:传入两个套接字即可在中转进程里无限循环转发,配合 XPUB/XSUB 可以搭出「订阅型消息总线」,配合 ROUTER/DEALER 可以搭出「请求应答中转」。中转进程就是一个几十行的普通程序(C/C++/Python 皆可),由 systemd 等常规方式托管即可——没有重型 broker 需要安装维护。
💡 说明:本平台《ZeroMQ 4.3.5 部署指南》与《ZeroMQ 4.3.5 常用 CLI 命令与工具详解》对 zmq_proxy 中转与配套工具做了逐命令实测,需要动手操作时可参考。
四、功能特性
基于 libzmq 4.3.5 发布包 NEWS 与官方文档(实查 2026-10-20),主要特性如下:
- 多消息模式:12 种稳定套接字类型覆盖请求应答、发布订阅、管道分发、独占配对等模式(见 3.1 节)。
- 多传输无缝切换:inproc/ipc/tcp 同 API 切换(见 3.2 节)。
- 安全加密:内置 CURVE 加密(对称密钥握手加密),底层密码实现可选 libsodium 或内置 tweetnacl;另支持 PLAIN 简单用户名密码与 DRAFT 状态的 GSSAPI(来源:官方文档 zmq_curve(7)、configure 的
--with-libsodium选项说明)。 - 许可友好:4.3.5 起整体采用 MPL-2.0(此前为 LGPL-3.0+ 加自定义例外),对闭源商业应用的链接使用更友好(来源:发布包 NEWS)。
- 4.3.5 新增(DRAFT)能力:
ZMQ_BUSY_POLL(底层 SO_BUSY_POLL)、ZMQ_HICCUP_MSG(断连通知消息)、ZMQ_XSUB_VERBOSE_UNSUBSCRIBE、ZMQ_TOPICS_COUNT(订阅主题计数)、ZMQ_NORM_*系列可靠组播选项与zmq_ppollAPI(来源:发布包 NEWS 逐条实查)。 - 跨平台与多语言:官方 CI 覆盖 Linux(Ubuntu 等)、Windows、macOS、Android NDK(来源:README 平台矩阵);语言绑定覆盖 Python(pyzmq)、Java(JeroMQ 纯 Java 实现)、.NET(NetMQ)、Node.js、Rust、Go 等 30 余种(来源:zeromq.org 语言绑定页)。
- 自带性能工具:源码
perf/目录内置 local_lat/remote_lat(往返时延)、local_thr/remote_thr(吞吐)、inproc_lat/inproc_thr(进程内基准)等测量工具,可随时对目标环境做量化体检。
五、快速开始(最小可用示例)
以下为 ZeroMQ 官方 Guide 的经典「Hello World」请求-应答示例(来源:zeromq.org 官方 Guide,C 语言版,代码逐行取自官方样例并加中文注释)。先在服务器上完成 libzmq 安装(本平台《Ubuntu 22.04 安装 ZeroMQ 4.3.5 指南》提供完整实测步骤),然后准备两个程序。
服务端 hwserver.c——REP 套接字收「Hello」回「World」:
// hwserver.c —— 来源:ZeroMQ 官方 Guide Hello World 示例
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main (void)
{
void *context = zmq_ctx_new ();
// 与客户端握手的 REP 套接字
void *responder = zmq_socket (context, ZMQ_REP);
int rc = zmq_bind (responder, "tcp://*:5555");
assert (rc == 0);
while (1) {
char buffer [10];
zmq_recv (responder, buffer, 10, 0);
printf ("Received Hello\n");
sleep (1); // 模拟业务处理耗时
zmq_send (responder, "World", 5, 0);
}
return 0;
}
客户端 hwclient.c——REQ 套接字发 10 次请求:
// hwclient.c —— 来源:ZeroMQ 官方 Guide Hello World 示例
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
int main (void)
{
void *context = zmq_ctx_new ();
// 与服务端通信的 REQ 套接字
void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");
int request_nbr;
for (request_nbr = 0; request_nbr != 10; request_nbr++) {
char buffer [10];
printf ("Sending Hello %d\n", request_nbr);
zmq_send (requester, "Hello", 5, 0);
zmq_recv (requester, buffer, 10, 0);
printf ("Received World %d\n", request_nbr);
}
zmq_close (requester);
zmq_ctx_term (context);
return 0;
}
编译与运行(先开一个终端跑服务端,再开另一个跑客户端):
gcc hwserver.c -lzmq -o hwserver # 编译服务端,链接 libzmq
gcc hwclient.c -lzmq -o hwclient # 编译客户端
./hwserver # 终端 1:输出 Received Hello
./hwclient # 终端 2:输出 Sending Hello 0..9 / Received World 0..9
要点:REQ 端 zmq_connect 到 tcp://localhost:5555,REP 端 zmq_bind 到 tcp://*:5555——ZeroMQ 中「谁 bind 谁 connect」完全自由,通常服务端 bind、客户端 connect,反向亦可。
六、适用场景与限制
6.1 典型适用场景
- 进程内/进程间高速通信:多线程(inproc)、多进程(ipc)之间需要微秒级消息通道时,ZeroMQ 几乎是 C/C++ 生态的默认答案之一。
- 分布式应用内部骨架:自研分布式系统的节点间消息层——交易系统行情分发(PUB/SUB)、任务并行分发(PUSH/PULL)、服务化 RPC 骨架(REQ/REP 或 DEALER/ROUTER)。
- 嵌入式与资源受限环境:库形态无额外进程,内存占用小,适合随应用一起部署在边缘设备。
- 替代手写 Socket 框架:需要处理粘包、重连、异步队列、多模式通信时,直接复用 ZeroMQ 的成熟实现。
6.2 明确的限制(选型红线)
- 无持久化与堆积管理:消息在内存队列中,进程崩溃即丢;不能像 Kafka/RabbitMQ 那样做可靠落盘投递。需要可靠投递时要自行实现确认与重发(官方 Guide 提供 Lazy Pirate 等模式)。
- 无中心管控:没有管理后台、消息轨迹、死信队列等运维设施,可观测性依赖业务自建。
- 拓扑自管:节点发现、地址管理由应用负责,节点多时需要引入外部配置或中转程序。
- 协议私有(ZMTP):跨语言没问题(各绑定都实现 ZMTP),但与非 ZeroMQ 系统直接互通需要网关(STREAM 套接字或协议桥)。
- 学习曲线在模式而非 API:API 极简,但「慢加入者」(slow joiner)、HWM 丢消息、REQ/REP 严格交替等行为需要理解,否则易踩坑(官方 Guide 第 1-5 章是必读)。
七、同类选型对比
选型的第一步是分清「库」与「服务」,第二步才是横向对比能力。下表给出主流同类组件的定位与能力对比(定性能力以各官方文档为准;社区热度为 shields.io 徽章实查或公开共识量级,查询日期 2026-10-20):
| 维度 | ZeroMQ 4.3.5 | RabbitMQ | Apache Kafka | NATS | Redis Pub/Sub | nanomsg/NanoMQ |
|---|---|---|---|---|---|---|
| 形态 | 消息库(无进程) | 中心 Broker 服务 | 分布式日志服务 | 轻量 Broker 服务 | 内存数据库子功能 | 消息库/轻量 Broker |
| 消息模式 | 12 种套接字模式 | 路由/队列(AMQP) | 分区日志、消费者组 | 发布订阅、请求应答、队列 | 发布订阅 | SP 协议多模式 |
| 持久化 | 无(内存队列) | 支持(镜像/持久队列) | 核心能力(落盘日志) | JetStream(可选) | 无(另有 Streams) | 有限/无 |
| 延迟量级 | 微秒级 | 毫秒级 | 毫秒~十毫秒级 | 亚毫秒~毫秒级 | 亚毫秒级 | 微秒级 |
| 吞吐量级 | 百万级 msg/s(inproc 实测量级) | 万~十万级 msg/s | 百万级 msg/s | 百万级 msg/s | 十万级 msg/s | 百万级 msg/s |
| 协议 | ZMTP 3.1 | AMQP 0-9-1/MQTT/STOMP | 自有协议(Kafka API) | NATS 协议/MQTT/WebSocket | RESP | SP/BUS、MQTT |
| 安全 | CURVE/PLAIN/GSSAPI | TLS/SASL | TLS/SASL/AACL | TLS/账户 NKey/JWT | TLS/AUTH | 有限 |
| 许可 | MPL-2.0 | MPL-2.0 | Apache-2.0 | Apache-2.0 | RSALv2/SSPLv1(Redis 8 起 AGPL/自由再许可双轨) | MIT |
| 管理运维 | 无(自管) | 管理台完善 | 生态工具丰富 | 简洁 | 复用 Redis 运维 | 极简 |
| 典型场景 | 嵌入式低延迟通信 | 企业级可靠投递 | 日志管道/流处理 | 云原生轻量消息 | 已有 Redis 的广播 | 嵌入式/边缘 MQTT 桥接 |
对比解读与选型建议:
- 要「库」还是要「服务」:消息能力要嵌进自己进程、追求极致低延迟、不要求持久化 → ZeroMQ/nanomsg;要独立消息基础设施、要管理台与可靠投递 → RabbitMQ/NATS。
- 吞吐与可靠性优先:日志管道、事件溯源、回放 → Kafka(接受毫秒级延迟与运维成本)。
- 已有 Redis 栈:轻量广播直接用 Redis Pub/Sub,不引入新组件;但注意其「无确认、无持久化」语义与 ZeroMQ 类似。
- ZeroMQ vs nanomsg:同为 brokerless 库,nanomsg(及其社区延续 NanoMQ/nanomsg-ng)API 更现代但生态与活跃度显著弱于 ZeroMQ;ZeroMQ 语言绑定、社区、文档(zguide)成熟度是压倒性优势。
- 社区活跃度量化参考:libzmq GitHub Star 约 11k、稳定版节奏约 1~3 年一版(4.3.3→4.3.4 间隔 15 个月、4.3.4→4.3.5 间隔 33 个月),定位为「极稳但演进慢」的基础库;RabbitMQ/Kafka 等服务的发版节奏快得多(周/月级),属于不同物种,不应用同一把尺子衡量。
八、参考链接
- ZeroMQ 官网:https://zeromq.org/
- libzmq 代码仓库:https://github.com/zeromq/libzmq
- libzmq Releases(4.3.5 发布说明):https://github.com/zeromq/libzmq/releases/tag/v4.3.5
- Releases Atom 源(版本实查依据):https://github.com/zeromq/libzmq/releases.atom
- 官方指南 The Guide:https://zguide.zeromq.org/
- 语言绑定列表:https://zeromq.org/languages/
- 官方 C API 文档(zmq_socket(7) 等):https://libzmq.readthedocs.io/
- MPL-2.0 许可证全文:https://www.mozilla.org/en-US/MPL/2.0/