29/PUBSUB
ZeroMQ 发布-订阅 (ZeroMQ Publish-Subscribe)
- 状态:稳定 (Status: stable)
- 编辑:Pieter Hintjens ph@imatix.com
本文档规定了 ZeroMQ 发布-订阅模式的语义,该模式涵盖 PUB、XPUB、SUB 和 XSUB socket 类型。本规范旨在指导这些 socket 类型的实现,以便用户能够依赖可靠的语义。
前言 (Preamble)
版权所有 (c) 2013-2014 iMatix Corporation。
本规范是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证(版本3或任何后续版本,由您选择)的条款重新分发和/或修改它。本规范是抱着希望它会有用而发布的,但没有任何担保;甚至不包括适销性或特定用途适用性的暗示担保。请参阅 GNU 通用公共许可证以获取更多详细信息。您应该已经随本程序收到了一份 GNU 通用公共许可证的副本;如果未收到,请参阅 https://gnu.ac.cn/licenses。
本规范是一个 自由开放标准,并受数字标准组织 (Digital Standards Organization) 的共识导向规范系统 (Consensus-Oriented Specification System) 管辖。
本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。
目标 (Goals)
本规范旨在正式记录 PUB、XPUB、SUB 和 XSUB socket 类型的名称和预期行为,这些类型共同构成了 ZeroMQ 发布-订阅模式。这些 socket 的合规实现 SHOULD 遵守本规范,从而确保应用程序能够依赖可预测的行为。本规范不特定于传输,但并非所有行为都能在所有传输上重现。
该模式的总体目标 (Overall Goals of this Pattern)
该模式旨在用于事件和数据分发,通常是从少量发布者到大量订阅者,但也可从许多发布者到少数订阅者。对于多对多的用例,该模式提供了原始 socket 类型 (XPUB, XSUB) 来构建分发代理(也称为 broker)。
具体的订阅和过滤机制取决于传输协议并在相关文档中定义。对于 TCP,请参阅 https://rfc.zeromq.cn/spec:23/ZMTP。
PUB Socket 类型 (The PUB Socket Type)
PUB socket 类型提供基本的单向广播给一组订阅者。在 TCP 上,它对传出消息进行过滤,但无论如何,为了到达多个订阅者,消息会通过网络发送多次。PUB 主要用于瞬态事件分发,在这种情况下,网络的稳定性(例如,持续低的内存使用)比流量的可靠性更重要。
一般行为 (General behavior)
- MAY 连接到任意数量的 SUB 或 XSUB 订阅者,且 SHALL 只发送消息。
- SHALL 为每个连接的订阅者维护一个单独的传出消息队列。
- SHALL 在启动到订阅者的传出连接时创建队列,且 SHALL 无论连接是否建立都维护该队列。
- SHALL 在订阅者连接到它时创建队列。如果此订阅者断开连接,PUB socket SHALL 销毁其队列,且 SHALL 丢弃其中包含的任何消息。
- SHOULD 将队列大小限制在运行时可配置的限制内。
- SHALL 静默丢弃订阅者发送给它的任何消息。
处理传出消息 (For processing outgoing messages)
- SHALL 不以任何方式修改传出消息。
- MAY,取决于传输方式,将所有消息发送给所有订阅者。
- MAY,取决于传输方式,仅将消息发送给具有匹配订阅的订阅者。
- SHALL 对订阅与消息第一帧的开头执行二进制比较。
- SHALL 如果订阅者的队列已满,则静默丢弃消息。
- SHALL NOT 阻塞发送。
处理订阅 (For processing subscriptions)
- SHALL 根据使用的传输协议接收来自订阅者的订阅和取消订阅请求。
- SHALL NOT 将这些命令传递给其调用应用程序。
XPUB Socket 类型 (The XPUB Socket Type)
XPUB socket 类型扩展了 PUB socket 的功能,使其能够接收来自匿名订阅者的消息,并向应用程序暴露订阅命令。XPUB 通常用于代理,但也适用于高级应用程序。
一般行为 (General behavior)
- MAY 连接到任意数量的 SUB 或 XSUB 订阅者,且 MAY 同时发送和接收消息。
- SHALL 为每个连接的订阅者维护一个双队列,允许传出和传入消息独立排队。
- SHALL 在启动到订阅者的传出连接时创建双队列,且 SHALL 无论连接是否建立都维护该双队列。
- SHALL 在订阅者连接到它时创建双队列。如果此订阅者断开连接,XPUB socket SHALL 销毁其双队列,且 SHALL 丢弃其中包含的任何消息。
- SHOULD 将传入和传出队列大小限制在运行时可配置的限制内。
处理传出消息 (For processing outgoing messages)
- SHALL 不以任何方式修改传出消息。
- MAY,取决于传输方式,将所有消息发送给所有订阅者。
- MAY,取决于传输方式,仅将消息发送给具有匹配订阅的订阅者。
- SHALL 对订阅与消息第一帧的开头执行二进制比较。
- SHALL 如果订阅者的队列已满,则静默丢弃消息。
- SHALL NOT 阻塞发送。
处理传入消息 (For processing incoming messages)
- SHALL 使用公平队列策略接收来自其订阅者的传入消息。
- SHALL 将这些消息传递给其调用应用程序。
处理订阅 (For processing subscriptions)
- SHALL 根据使用的传输协议接收来自订阅者的订阅和取消订阅请求。
- SHALL 将这些命令传递给其调用应用程序。
- MAY,取决于配置,规范化传递给其调用应用程序的命令,以便多个相同的订阅只产生一个命令。
- SHALL,如果订阅者对等方过早断开连接,则为调用应用程序生成一个合适的取消订阅请求。
SUB Socket 类型 (The SUB Socket Type)
SUB socket 类型提供一个基本的单向监听器,用于监听一组发布者。
一般行为 (General behavior)
- MAY 连接到任意数量的 PUB 或 XPUB 发布者,且 SHALL 只接收消息。
- SHALL 为每个连接的发布者维护一个单独的传入消息队列。
- SHALL 在启动到发布者的传出连接时创建队列,且 SHALL 无论连接是否建立都维护该队列。
- SHALL 在发布者连接到它时创建队列。如果此发布者断开连接,SUB socket SHALL 销毁其队列,且 SHALL 丢弃其中包含的任何消息。
- SHOULD 将队列大小限制在运行时可配置的限制内。
处理传入消息 (For processing incoming messages)
- SHALL 如果发布者的队列已满,则静默丢弃消息。
- SHALL 使用公平队列策略接收来自其发布者的传入消息。
- SHALL 不以任何方式修改传入消息。
- MAY,取决于传输方式,根据订阅使用前缀匹配算法过滤消息。
- SHALL 将消息传递给其调用应用程序。
处理订阅 (For processing subscriptions)
- MAY 根据使用的传输协议向发布者发送订阅和取消订阅请求。
XSUB Socket 类型 (The XSUB Socket Type)
XSUB socket 类型扩展了 SUB socket 的功能,使其能够向上游向发布者发送消息和订阅命令。XSUB 通常用于代理,但也适用于高级应用程序。
一般行为 (General behavior)
- MAY 连接到任意数量的 PUB 或 XPUB 发布者,且 MAY 同时发送和接收消息。
- SHALL 为每个连接的发布者维护一个双队列,允许传出和传入消息独立排队。
- SHALL 在启动到发布者的传出连接时创建双队列,且 SHALL 无论连接是否建立都维护该双队列。
- SHALL 在发布者连接到它时创建双队列。如果此发布者断开连接,XSUB socket SHALL 销毁其双队列,且 SHALL 丢弃其中包含的任何消息。
- SHOULD 将传入和传出队列大小限制在运行时可配置的限制内。
处理传入消息 (For processing incoming messages)
- SHALL 不以任何方式修改传入消息。
- SHALL 如果发布者的传入队列已满,则静默丢弃消息。
- SHALL 使用公平队列策略接收来自其发布者的传入消息。
- MAY,取决于传输方式,根据订阅使用前缀匹配算法过滤消息。
- SHALL 将消息传递给其调用应用程序。
处理传出消息 (For processing outgoing messages)
- SHALL 不以任何方式修改传出消息。
- SHALL 将所有消息发送给所有连接的发布者。
- SHALL 如果发布者的传出队列已满,则静默丢弃消息。
- SHALL NOT 阻塞发送。
处理订阅 (For processing subscriptions)
- SHALL 接受来自其调用应用程序的订阅命令。
- SHALL 根据使用的传输协议向发布者发送订阅和取消订阅请求。
- 关闭与发布者的连接时,SHOULD 发送所有订阅的取消订阅请求。
安全方面 (Security Aspects)
本规范没有安全方面。