ZeroMQ
ZeroMQ(简称 ZMQ / 0MQ)是一个高性能异步消息通信库,不是一个传统消息中间件(如 RabbitMQ),它更像是在 Socket 之上封装的消息队列 + 并发模型。
ZeroMQ 的基本通信模式
ZeroMQ 提供了多种通信模式,每种模式都适用于不同的应用场景。了解这些模式是有效使用 ZeroMQ 的关键。
请求-响应模式 (Request-Reply)
请求-响应是最基本的通信模式,类似于传统的客户端-服务器模型。一个请求对应一个响应,通信是同步的。
工作原理
客户端(REQ 套接字)向服务器发送请求 服务器(REP 套接字)接收请求并处理 服务器向客户端发送响应 客户端接收响应 重要的是,REQ 和 REP 套接字都遵循严格的收发顺序:
REQ: 发送-接收-发送-接收… REP: 接收-发送-接收-发送… 如果不遵循这种模式,会导致错误
注意事项
每个请求必须等待上一个响应 如果服务器崩溃,客户端将被阻塞,注意要先启动服务端 必须严格遵循发送-接收顺序 为避免单点故障,可以实现更高级的模式,如带有心跳的请求-响应
发布-订阅模式 (Publish-Subscribe)
发布-订阅模式是一种单向数据分发模式,发布者不需要知道谁在接收消息,订阅者只获取自己感兴趣的消息。
工作原理
发布者(PUB 套接字)发送消息,通常包含一个主题/类别前缀 订阅者(SUB 套接字)通过设置过滤器来订阅感兴趣的主题 订阅者只接收与其订阅过滤器匹配的消息
注意事项
晚连接的订阅者会错过之前发布的消息 如果没有订阅者,发布的消息将被丢弃 必须使用 socket.setsockopt_string(zmq.SUBSCRIBE, “”) 订阅所有消息 发布-订阅模式不保证消息投递 过滤是基于前缀匹配的,不是正则表达式 socket.setsockopt_string(zmq.SUBSCRIBE, “天”) 也能收到 天气 主题
推拉模式 (Push-Pull)
推拉模式创建了一个管道,数据从一端流向另一端,类似于流水线。多个节点可以参与推送或拉取过程,实现负载均衡。
工作原理
生产者(PUSH 套接字)推送任务/数据 工作者(PULL 套接字)拉取任务/数据 多个工作者可以从同一个生产者拉取任务,实现负载均衡 结果可以通过另一个管道收集
注意事项
推拉模式是单向的 负载自动在可用工作者之间均衡分配 可以与其他模式结合使用,构建复杂的数据流 推送端在没有接收者时会阻塞
独家对模式 (Exclusive Pair)
独家对模式是一种特殊模式,用于两个套接字之间的独占双向通信。
工作原理
两个节点之间建立双向通信通道 每个节点都可以随时发送和接收消息 这种模式主要用于进程内通信或特定的互连场景
注意事项
PAIR 套接字只能与一个对等方连接 它不执行自动重连 必须自己处理连接状态 主要用于进程内或线程间通信
DDS
是一套标准化的实时分布式通信中间件规范(由对象管理组织OMG制定),核心是以数据为中心的发布-订阅(DCPS)模型,强调实时性、确定性、服务质量(QoS)控制,主要用于工业、自动驾驶、机器人、航空航天等对实时性和可靠性要求极高的场景。 常见实现有 RTI Connext DDS、Eclipse Cyclone DDS、Fast DDS(原FastRTPS)等,遵循统一规范,不同厂商实现可互操作。