ZeroMQ PUB/XPUB/XSUB/SUB 过滤

Dre*_*kes 7 architecture messaging publish-subscribe zeromq

我试图从\xc3\x98MQ 指南中确定所谓的“扩展 Pub-Sub 架构”的确切行为和潜在限制。

\n\n

\n\n

XPUB和XSUB描述:

\n\n
\n

我们需要 XPUB 和 XSUB 套接字,因为 ZeroMQ 进行从订阅者到发布者的订阅转发。XSUB 和 XPUB 与 SUB 和 PUB 完全相同,只是它们将订阅公开为特殊消息。代理必须通过从 XSUB 套接字读取这些消息并将其写入 XPUB 套接字,将这些订阅消息从订阅者端转发到发布者端。这是 XSUB 和 XPUB 的主要用例。

\n
\n\n

我已设置 XSUB 和 XPUB 套接字作为代理的前端后端,并将另一对 PAIR 套接字连接到捕获端口。这使我能够观察通过代理传递的消息。

\n\n

在我的架构中,每个节点既是 PUB 又是 SUB。本质上我希望这个 XPUB/XSUB 代理能够提供一个共享总线,以及主题前缀订阅。

\n\n

SUB 节点连接后,它必须订阅一个(可能为空)主题。这会导致通过代理传输一帧消息。假设我的主题是{0xff 0xFF},消息是:

\n\n
{0x01 0xFF 0xFF}\n
Run Code Online (Sandbox Code Playgroud)\n\n

前导0x01表示订阅,后跟主题字节。类似的消息用 a0x00代替 a0x01表示取消订阅。

\n\n

我关心的是订阅信息到底保存在这个架构中的哪里。

\n\n

根据指南:

\n\n
\n

从 ZeroMQ v3.x 开始,当使用连接协议(tcp://ipc://)时,过滤发生在发布者端。

\n
\n\n

如果发布者端确实进行了过滤,那么在PUB上线之前SUB订阅会有问题吗?PUB 是否会被告知预先存在的订阅(可能来自 XSUB)?

\n\n

我的系统将具有具有动态生命周期的节点。这会成为一个问题吗?还有其他我应该注意的问题吗?

\n

Hen*_*rik 2

如果发布者端确实进行了过滤,那么在PUB上线之前SUB订阅会有问题吗?

不,这会自行解决。

PUB 是否会被告知预先存在的订阅(可能来自 XSUB)?

对,就是这样。

我的系统将具有具有动态生命周期的节点。这会成为一个问题吗?还有其他我应该注意的问题吗?

您将丢失没有订阅者的已发布消息,因此要么创建一个窗口发布消息的代理,要么让订阅者要求发布者重新发布并对消息进行幂等处理。

这是您可以使用的全双工代理示例。您会注意到,如果您在“ping”(球的发布者)之前启动“pong”(球弹跳的墙壁),那么一切都会起作用,但如果您在 pong 订阅者启动之前发布 ping ,就会丢失。