此文档规定了 ZeroMQ 发布订阅模式。覆盖了 PUB, XPUB, SUB, XSUB 套接字类型。此规范意图指导这些套接字的实现以为用于提供可靠的语义。

原文地址: 29/PUBSUB

目标

此规范用来规定 PUB, XPUb, SUB 和 XSUB 套接字类型。所有这些套接字的实现都应该遵循此规,以为应用提供可靠的语义。此规范不是传输层协议,但是不是所有的行为都能在所有的传输层上复现。

模式目标

这个模式用来进行事件和数据分发,一般是少数的 publisher 和多数的 subscriber,但是也可能反过来。对于多对多的使用场景,此模式提供了原生套接字类型(XPUB, XSUB)用来构造分发代理(也叫 broker)。

订阅和过滤机制的具体行为依赖于传输层协议并定义在相关的文档中。对于 TCP,参见 ZMTP3.0

PUB 套接字

PUB 套接字提供了向多个订阅者广播的能力。对于 TCP,它会执行服务端过滤。尽管如此,它依然会见一个消息发送多次来将其传递到多个订阅者。PUB is used mainly for transient event distribution where stability of the network (e.g. consistently low memory usage) is more important than reliability of traffic.

通用行为:

  • 可能 被多个 SUB/XSUB 订阅,并且只会发送消息。

  • 对每个连接的订阅者 必须 维护一个传出消息队列。

  • 在向订阅者发起传出连接时,应创建一个队列,并且无论是否建立连接,都应维护该队列。

  • 将会建立一个连接到它的 subscriber 队列。如果订阅者断开,则清空并销毁它的队列。

  • 能够在运行时更改队列的上限。

  • 会静默地丢弃订阅者发给它的任何消息。

当处理传出消息时:

  • 不能以任何形式修改传出消息。

  • 依赖于运输层,可能将所有的消息发送给所有的订阅者。

  • 依赖于传输层,可能只会给订阅者发送匹配的订阅。

  • 订阅只会用于同消息的第一帧开头进行二进制比较。

  • 如果订阅者的队列已慢,则静默丢弃消息。

  • 永远是非阻塞的。

对于处理订阅:

  • 依赖于使用的运输层。将会接收订阅和取消订阅请求。

  • 不得将这些命令传递到其调用应用程序。

XPUB 套接字

XPUB 套接字拓展了 PUB 套接字,使其能够从匿名 subscriber 中接受消息,并将这些订阅命令暴露给应用。XPUB 一般用作代理,但是也可能用于高级应用。

一般行为:

  • 可能 于任意数量的 SUB/XSUB 订阅者连接,也 可能 发送或者接受消息。

  • 将会为每个订阅者维护两个独立的队列,分别用于传入和传出消息。

  • 在向订阅者发起传出连接时,应创建双队列,无论是否建立连接,都应保持双队列。

  • 在订阅者连入时会创建双队列,如果订阅者断开连接,则清空队列中的消息并销毁队列。

  • 传入和传出队列的大小可以在运行时配置。

对于传出消息:

  • 不得以任何方式修改传出消息。

  • 根据传输方式的不同,可以将所有消息发送给所有订阅者。

  • 根据传输方式的不同,可能仅向具有匹配订阅的订阅者发送消息。

  • 订阅只会用于同消息的第一帧开头进行二进制比较。

  • 如果订阅者的队列已满,则应以静默方式删除消息。

  • 非阻塞发送。

对于传入消息:

  • 应使用公平排队策略接收来自其订阅者的传入消息。

  • 应将这些消息传递到用户程序。

对于订阅请求:

  • 应接收来自订阅者的订阅和取消订阅请求,具体取决于所使用的传输协议。

  • 应将这些命令传递到用户程序。

  • 根据配置,可以规范化传递给用户程序的命令,以便多个相同的订阅仅生成单个命令。

  • 如果订阅者对等体过早断开连接,则为用户程序生成合适的取消订阅请求。

SUB 套接字

SUB 套接字为一组发布者提供单项监听器。

一般行为:

  • 可以连接到任意数量的 PUB 或 XPUB 发布者,并且只能接收消息。

  • 应为每个连接的发布者维护一个传入消息队列。

  • 在发起连接时创建队列。无论连接是否成功建立都需要维护此队列。

  • 在发布者连接时创建队列。如果发布者断开连接,则销毁队列并丢弃所有消息。

  • 应在发布者连接到队列时创建队列。如果此发布者断开连接,则 SUB 套接字将销毁其队列并丢弃其包含的任何消息。

  • 应将队列大小限制为运行时可配置的限制。

对于处理传入消息:

  • 如果发布者的队列已满,则以静默方式丢弃消息。

  • 使用公平排队策略接收来自其发布者的传入消息。

  • 不得以任何方式修改传入的邮件。

  • 根据传输情况,可以使用前缀匹配算法根据订阅筛选邮件。

  • 将消息传递到其调用应用程序。

对于处理订阅:

  • 可以向发布者发送订阅和取消订阅请求,具体取决于所使用的传输协议。

XSUB 套接字

XSUB 套接字类型扩展了 SUB 套接字,使其能够向上游发布者发送消息和订阅命令。XSUB 通常用于代理,但也可用于高级应用程序。

一般行为:

  • 可以连接到任意数量的 PUB 或 XPUB 发布者,并且可以发送和接收消息。

  • 为每个连接的发布者维护一个双队列,允许传出和传入消息独立排队。

  • 在发起连接时创建双队列,并且无论是否建立连接,都应维护双队列。

  • 当接受连接创建一个双队列。如果此发布者断开连接,则 XSUB 套接字将销毁其双队列,并丢弃其包含的任何消息。

  • 应将传入和传出队列大小限制为运行时可配置的限制。

对于处理传入消息:

  • 不得以任何方式修改传入的邮件。

  • 如果发布者的传入队列已满,则以静默方式丢弃消息。

  • 使用公平排队策略接收来自其发布者的传入消息。

  • 根据传输情况,可以使用前缀匹配算法根据订阅筛选邮件。

  • 将消息传递到其调用应用程序。

用于处理传出邮件:

  • 不得以任何方式修改传出消息。

  • 应将所有消息发送到所有连接的发布者。

  • 如果发布者的传出队列已满,则以静默方式删除邮件。

  • 不得阻塞发送。

对于处理订阅:

  • 应接受来自其调用应用程序的订阅命令。

  • 应根据所使用的传输协议向发布者发送订阅和取消订阅请求。

  • 关闭与发布者的连接时,应发送所有订阅的取消订阅请求。

安全方面

此规范没有安全方面。

Last moify: 2025-04-07 07:03:40
Build time:2025-07-18 09:41:42
Powered By asphinx