ZeroMQ PUB / XPUB / XSUB / SUB过滤

时间:2015-02-19 15:13:57

标签: architecture messaging zeromq publish-subscribe

我正在尝试确定所谓的“扩展Pub-Sub架构”的确切行为和潜在局限性。来自ØMQ guide

描述了XPUB和XSUB:

  

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

我已将XSUB和XPUB套接字设置为代理的前端后端,并拥有另一对PAIR套接字连接到 capture 端口。这允许我观察通过代理传递的消息。

在我的架构中,每个节点都是PUB和SUB。基本上我希望这个XPUB / XSUB代理提供一个共享总线,主题前缀订阅。

SUB节点连接后,它必须使用(可能为空)主题进行订阅。这导致通过代理发送一帧消息。假设我的主题是{0xff 0xFF},则消息为:

{0x01 0xFF 0xFF}

前导0x01表示订阅,后跟主题字节。使用0x00而不是0x01的类似邮件代表取消订阅。

我关注的是这个架构中保留了订阅信息的确切位置。

根据指南:

  

从ZeroMQ v3.x开始,使用连接协议(tcp://ipc://)时,发布方会进行过滤。

如果确实在发布方进行了过滤,那么如果SUB在 PUB上线之前订阅了,那么这是一个问题吗?是否可以从XSUB获知PUB预先存在的订阅?

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

1 个答案:

答案 0 :(得分:2)

  

如果确实在发布方进行了过滤,那么如果SUB在PUB上线之前订阅了,那么这是一个问题吗?

不,那会自行解决。

  

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

确实是。

  

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

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

您可以使用的全双工代理的

Here's a sample。你会注意到,如果你在“ping”(球的发布者)之前启动“pong”(球弹开的墙),它将全部工作,但如果你在pong订阅者启动之前发布ping ,它会丢失。