【问题标题】:How do I do multiple publishers with a single endpoint in ZeroMQ?如何在 ZeroMQ 中使用单个端点执行多个发布者?
【发布时间】:2013-08-26 16:18:51
【问题描述】:

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

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

如果我尝试与发布者进行多次绑定,ipc 会发生“预期的”zmq 静默窃取总线的行为,并且 tcp 会引发 port in use 错误。

我已经用 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());
}

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

【问题讨论】:

  • 你的问题不清楚;考虑修改。

标签: zeromq publish-subscribe


【解决方案1】:

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

理论上,对于 ØMQ 套接字,哪一端连接和哪一端绑定都没有关系。但是,在实践中存在未记录的差异,我稍后会谈到。现在,绑定 PUB 并连接 SUB,除非您的网络设计无法实现。

我还没有发现“稍后再来”实际发生在哪里,但我并没有经常使用 pub/sub,也没有详细阅读指南中的“高级 Pub-Sub 模式”部分详细。

但是,对我来说,多个发布者在一个端点上的想法表明需要XPUB/XSUB 风格的经纪人;这不是关于动态发现,而是关于单点联系和路由。最终,我认为基于代理的拓扑会简化您的应用程序,并更容易识别问题。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      相关资源
      最近更新 更多