如何在ZeroMQ中使用单个端点执行多个发布者?

sti*_*tix 8 publish-subscribe zeromq

我正在尝试建立一个发布/订阅架构,其中多个发布者和多个订阅者存在于同一总线上.根据我在互联网上读到的内容,只有一个套接字应该调用bind(),而其他所有套接字(无论是pub还是sub)都应该调用connect().

问题是,通过这种方法,我发现只有实际上在套接字上调用bind()的发布者才会发布消息.我调用connect()的所有发布者似乎都默默地失败,并且实际上并没有向总线发布任何消息.我已经确认这不是订阅者密钥问题,因为我编写了一个简单的"嗅探器"应用程序,它订阅了总线上的所有消息,并且它只显示名为bind()的发布者.

如果我尝试与发布者进行多次绑定,则使用ipc发生静默窃取总线的"预期"zmq行为,并且使用tcp抛出正在使用的端口错误.

我已经使用ipc和tcp端点验证了这种行为,但最终整个系统将使用epgm.我假设(虽然当然可能是错的)在这种情况下我不需要代理,因为没有动态发现(端点是已知的,无论是ipc,tcp还是epgm多播).

是否有一些我缺少的东西,也许是套接字设置,这会导致连接发布者实际上不发送他们的数据?根据我在互联网上看到的文献,我正在以"正确"的方式做事,但它仍然无效.

作为参考,我的发布者类具有以下用于设置端点的方法:

ZmqPublisher::ZmqPublisher()
: m_zmqContext(1), m_zmqSocket(m_zmqContext, ZMQ_PUB)
{}


void ZmqPublisher::bindEndpoint(std::string ep)
{
    m_zmqSocket.bind(ep.c_str());
}

void ZmqPublisher::connect(std::string ep)
{
    m_zmqSocket.connect(ep.c_str());
}
Run Code Online (Sandbox Code Playgroud)

最后,我的问题是:在同一端点上处理多个发布者的正确方法是什么,为什么我没有看到来自多个发布者的消息?

And*_*kha 6

你的错误是你用bind调用一个发布者,用connect调用其他发布者。普通 PUB-SUB 模式不支持此功能。

\n

ZeroMQ 中的普通 PUB-SUB 仅支持两种场景(见下图):

\n
    \n
  • 单个发布者,多个订阅者
  • \n
  • 单个订阅者,多个发布者
  • \n
\n

在这两种情况下,“单身”一方必须bind,而“多方”一方必须connect。否则,如果您想要多对多,您可以使用XPUB-XSUB或其他模式。

\nZeroMQ / ZMQ / \xc3\x98MQ 发布-订阅模式。 两种场景:1)单个发布者,多个订阅者; 2)单个订阅者,多个发布者\n


Ste*_*ove 4

它可能相关,也可能不相关,但0MQ 指南有以下有点神秘的评论:

\n\n
\n

理论上,对于 \xc3\x98MQ 套接字,哪一端连接以及哪一端绑定并不重要。然而,实际上存在一些未记录的差异,我稍后会谈到。现在,绑定 PUB 并连接 SUB,除非您的网络设计不允许这样做。

\n
\n\n

我还没有发现“稍后再说”实际上发生在哪里,但我用得不pub/sub多,也没有详细阅读指南的“高级 Pub-Sub 模式”部分。

\n\n

然而,对我来说,多个出版商在一个端点上的想法表明需要一个XPUB/XSUB风格经纪人;这与动态发现无关,而是与单点联系和路由有关。最终,我认为基于代理的拓扑将简化您的应用程序,并使其更容易发现问题。

\n