ZeroMQ PUB/XPUB/XSUB/SUB 过滤

ZeroMQ PUB/XPUB/XSUB/SUB filtering

我正在尝试从 ØMQ guide.

中确定 so-called 'Extended Pub-Sub architecture' 的确切行为和潜在限制

XPUB 和 XSUB 描述:

We need XPUB and XSUB sockets because ZeroMQ does subscription forwarding from subscribers to publishers. XSUB and XPUB are exactly like SUB and PUB except they expose subscriptions as special messages. The proxy has to forward these subscription messages from subscriber side to publisher side, by reading them from the XSUB socket and writing them to the XPUB socket. This is the main use case for XSUB and XPUB.

我已经将 XSUB 和 XPUB 套接字设置为 front-endback-end代理,并将另一对 PAIR 套接字连接到 capture 端口。这让我可以观察通过代理传递的消息。

在我的架构中,每个节点既是 PUB 又是 SUB。本质上,我希望这个 XPUB/XSUB 代理将提供一个共享总线,有 topic-prefix 个订阅。

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

{0x01 0xFF 0xFF}

开头的 0x01 表示订阅,后面是主题字节。带有 0x00 而不是 0x01 的类似消息表示取消订阅。

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

根据指南:

From ZeroMQ v3.x, filtering happens at the publisher side when using a connected protocol (tcp:// or ipc://).

如果确实在发布者端进行了过滤,那么SUB在上线之前订阅是否有问题? PUB 是否会收到 pre-existing 订阅的通知,也许来自 XSUB?

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

If filtering is indeed performed on the publisher side, then is it a problem if a SUB subscribes before a PUB comes online?

不,这会自行解决。

Will the PUB be informed of pre-existing subscriptions, perhaps from XSUB?

完全正确。

My system will have nodes with dynamic lifetimes. Will this be an issue, and are there any other issues I should be aware of?

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

Here's a sample 您可以使用的全双工代理。您会注意到,如果您在 "ping"(球的发布者)之前启动 "pong"(球在其上弹跳的墙),则一切正常,但如果您在pong 订阅者已启动,它将丢失。