c++ - ZeroMQ XPUB/XSUB 严重缺陷?

标签 c++ zeromq

似乎 XPUB/XSUB 套接字类型有一个很难解决的严重缺陷:

XPUBSUB

这是我对该中心节点的实现:

#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;
}

当然,问题是慢工综合症。如果我将一个新发布者连接到 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;
}

但是,如果我在连接到 XSUB 后 sleep(1),它会神奇地工作:

#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;
}

该指南声称有一个简单的解决方案来解决这种“慢连接”综合症,但从未提供有效的同步 XSUB/XPUB 实现。经过大量搜索,看起来大多数人只是在 sleep ,这真的很糟糕。

为什么这个问题一直没有被修复?有任何已知的解决方法吗?我所有的谷歌查询都让我回到指南...

最佳答案

我找到了一种解决方法 here ,也就是在发布端使用PUSH/PULL,在订阅端使用PUB/SUB。新拓扑如下所示:

pullpub

这是中心节点所需的代码:

#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;
}

然后对于发布商:

#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;
}

此解决方案似乎运行良好,我希望人们在看到它的任何缺点时提出意见。如果我遇到更好的答案,我会在这里发布。

关于c++ - ZeroMQ XPUB/XSUB 严重缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43129714/

相关文章:

java - 如何使用ZeroMq实现异步即时通讯聊天

c++ - 从 C++ 文件中读取部分未定义大小的记录

c++ - 如果 std::variant 包含 void* 数据,它的析构函数会做什么

c++ - 类似iOS UIKit Dynamics的Qt/C++物理引擎

c# - 在 C# UWP 中使用 PublisherSocket 发布消息未在 python 中收到

node.js - Node js中基于ZeroMQ曲线的安全性

python - zmq 中的 PUSH/PULL 和 DEALER/ROUTER 模式有什么区别?

c++ - 在范围适配器的迭代器类中实现 operator->

c++ - 打印信号/槽的跟踪称为

python - 如何使用 django 纠正 zmq 地址使用错误