我正在尝试做一个发布/订阅架构,其中多个发布者和多个订阅者存在于同一总线上。根据我在互联网上阅读的内容,只有一个套接字应该调用 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());
}
所以最终,我的问题是:在同一端点上处理多个发布者的正确方法是什么,为什么我看不到来自多个发布者的消息?