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

时间:2013-08-26 16:18:51

标签: zeromq publish-subscribe

我正在尝试建立一个发布/订阅架构,其中多个发布者和多个订阅者存在于同一总线上。根据我在互联网上看到的内容,只有一个套接字应该调用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());
}

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

2 个答案:

答案 0 :(得分:3)

它可能相关,也可能不相关,但The 0MQ Guide有以下略带神秘的评论:

  

理论上,对于ØMQ套接字,哪个端连接以及哪个端绑定无关紧要。然而,在实践中,我将在稍后提出无证差异。现在,绑定PUB并连接SUB,除非您的网络设计使其不可能。

我还没有发现“后来”实际发生的地方,但我没有使用pub/sub这么多,并且没有阅读指南的“高级Pub-Sub模式”部分非常详细。

然而,就我而言,单个终端上的多个发布者的想法表明需要一个XPUB/XSUB样式的代理人;它不是关于动态发现,而是关于单点联系和路由。最终,我认为基于代理的拓扑可以简化您的应用程序,并使识别问题变得更容易。

答案 1 :(得分:0)

您的错误是您使用 bind 调用了单个发布者,而使用 connect 调用了其他发布者。普通 PUB-SUB 模式不支持此操作。

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

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

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

ZeroMQ / ZMQ / ØMQ Pub-Sub pattern. Two scenarios: 1) single publisher, multiple subscribers; 2) single subscriber, multiple publishers