XPUB/XSUB 套接字类型似乎有一个难以解决的严重缺陷:
这是我对该中心节点的实现:
#include <zmq.hpp>
int main()
{
zmq::context_t context(1);
//Incoming publications come here
zmq::socket_t sub(context, ZMQ_XSUB);
sub.bind("ipc://subscriber.ipc");
//Outgoing publications go out through here.
zmq::socket_t pub(context, ZMQ_XPUB);
pub.bind("ipc://publisher.ipc");
zmq::proxy(sub, pub, nullptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,问题是慢木匠综合症。如果我将一个新发布者连接到 XSUB 并发布一些消息,它们就会消失:
#include "zhelpers.hpp"
int main () {
// Prepare our context and publisher
zmq::context_t context(1);
zmq::socket_t publisher(context, ZMQ_PUB);
publisher.connect("ipc://subscriber.ipc");
s_sendmore (publisher, "B");
s_send (publisher, "Disappears into the void!!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我sleep(1)连接到 XSUB 后,它会神奇地工作:
#include "zhelpers.hpp"
int main () {
// Prepare our context and publisher
zmq::context_t context(1);
zmq::socket_t publisher(context, ZMQ_PUB);
publisher.connect("ipc://subscriber.ipc");
sleep(1);
s_sendmore (publisher, "B");
s_send (publisher, "Magically works!!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该指南声称有一个简单的解决方案可以解决这种“缓慢加入者”综合症,但从未提供有效的同步 XSUB/XPUB 实现。经过大量搜索后,看起来大多数人都只是sleeping,这确实很糟糕。
为什么这个问题一直没有得到解决?有任何已知的解决方法吗?我所有的谷歌查询都只是让我回到指南......
我在这里找到了一种解决方法,那就是在发布者端使用 PUSH/PULL,在订阅者端使用 PUB/SUB。新的拓扑如下所示:
这是中心节点所需的代码:
#include <zmq.hpp>
int main()
{
zmq::context_t context(1);
//Incoming publications come here
zmq::socket_t sub(context, ZMQ_PULL);
sub.bind("ipc://subscriber.ipc");
//Outgoing publications go out through here.
zmq::socket_t pub(context, ZMQ_PUB);
pub.bind("ipc://publisher.ipc");
zmq::proxy(sub, pub, nullptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后对于出版商:
#include "zhelpers.hpp"
int main () {
// Prepare our context and publisher
zmq::context_t context(1);
zmq::socket_t publisher(context, ZMQ_PUSH);
publisher.connect("ipc://subscriber.ipc");
s_sendmore (publisher, "B");
s_send (publisher, "No sleep!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案似乎运作得相当好,我希望人们在看到它有任何缺点时参与进来。如果我找到更好的答案,我会在这里发布。
| 归档时间: |
|
| 查看次数: |
3103 次 |
| 最近记录: |