如何使用 ZeroMQ 为两个发布者使用同一个端口向同一个订阅者发送数据?

How to use same port for two publishers for sending data to the same subscriber using ZeroMQ?

我正在用 C++ 创建一个应用程序,其中两个发布者,比如 pub1pub2,应该向 3 个订阅者发送数据,比如 s1s2 , s3.

规律如下:

Pub1 发送数据到 s1s2

Pub2 将数据发送到 s2s3

现在,如果我为发布者使用不同的 TCP 端口,它可以工作,但我需要使用单个端口来完成,当为两个发布者使用相同的端口时,只有绑定的发布者第一个工作,另一个发布者抛出内存错误。

有什么想法吗?

在内部使用 zmq::proxy 以允许多个发布套接字通过一个 TCP 端口提供数据。

P1(subject P1) -inproc-> |                       |--tcp-> SUB(P1)
                         |--XSUB(zmq::proxy)XPUB-|--tcp-> SUB(P1,P2)
P2(subject P2) -inproc-> |                       |--tcp-> SUB(P2)

方法:

出版商申请

  • 两个 PUB 套接字(在发布者应用程序内 ),一个使用主题 "P1" 发布,另一个 "P2"
  • 它们都在您的应用程序内部通过 //:inproc 连接到 zmq::proxyXSUB 端。代理也在您的发布者应用程序中 运行
  • 代理的另一端(XPUB 端)绑定到单个 TCP 端口。

订户申请

  • 您的订阅者应用程序连接到 TCP 端口并订阅他们需要的内容。
    • 例如 S1 将订阅 "P1" 而 S2 将同时订阅 "P1" 和 "P2"
    • 例如subscribe_sock.setsockopt(ZMQ_SUBSCRIBE, "P1", 2)
    • 例如subscribe_sock.setsockopt(ZMQ_SUBSCRIBE, "P2", 2)