6

我正在尝试使用 ZeroMQ 设置“倒置”PUB/SUB。

这意味着订阅(SUB)套接字属于几个长期存在的服务器,做zmq_bind(); 和发布(PUB)套接字是一个短暂的客户端,并且zmq_connect().

我使用单个ipc://套接字。

我希望来自发布者的消息会到达每个订阅者。

问题:只有一个订阅者进程接收到消息。如果该过程终止,发布者将陷入zmq_term().

zmq是否支持这种操作模式?如果是,那我做错了什么?如果没有,那么如何实现我需要的?

带有一些额外细节的最小示例(在 Lua 中,但这不重要):https ://gist.github.com/938429

4

3 回答 3

6

您不能将多个套接字绑定到一个ipc://地址(我们在这里讨论的是 Unix 域套接字 ipc:///tmp/test.ipc == file /tmp/test.ipc)。

您可以做的是将每个 SUB 套接字绑定到不同的 ipc:// 地址,并让发布者将一个 PUB 套接字连接到每个地址。ZeroMQ 允许一个套接字绑定/连接到多个地址。

zmq_term() 上的阻塞很可能是因为延迟关闭问题(即有一条消息表明 PUB 套接字正在尝试发送)。看看ZMQ_LINGER套接字选项。

于 2011-04-23T07:58:44.743 回答
4

ipc:// 传输有一个“特性”,即如果两个进程绑定到同一个 IPC 端点,第二个进程会悄悄地从第一个进程中窃取绑定。此“功能”旨在允许进程在崩溃后轻松恢复。

这就是为什么只有一个订阅者收到消息的原因。

既然您只有一个发布者,为什么不绑定发布者并将订阅者连接到该发布者?即使发布者来来去去,订阅者也会自动重新连接。

于 2012-11-21T06:33:55.003 回答
2

您不能将多个套接字绑定到一台机器上的同一地址,无论是 ipc 还是 tcp、SUB/PUB 或 REQ/REP。这就像网络套接字的绑定。

从许多发布者向所有订阅者发送消息的方法是实现一个简单的代理,它绑定到一个 SUB 地址和一个 PUB 地址。发布者连接到 SUB 套接字发送消息,订阅者连接到同一个代理的 PUB 套接字,代理简单地将所有从 SUB 套接字接收到的消息转发到 PUB 套接字。它需要一些性能开销,但很容易编程。

在 ZeroMQ 2.0 中有一个可执行的 zmq_forwarder 可用于此目的,在 2.1 中请参阅 zmq_device(3) 函数。

于 2011-04-25T10:51:14.567 回答