用ZeroMQ倒置PUB / SUB的问题

我试图用ZeroMQ设置“倒置”的PUB / SUB。

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

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

我希望发布者的消息能够到达每个用户。

问题:只有一个用户进程接收到消息。 如果这个过程死了,发布者就会陷入zmq_term()

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

最小的例子与一些额外的细节(在Lua中,但这不应该): https : //gist.github.com/938429

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

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

zmq_term()上的阻塞很可能会延迟关闭问题(即存在PUB套接字试图发送的消息)。 看看ZMQ_LINGER套接字选项。

有一个ipc:// transport的“特性”,就是说如果两个进程绑定到同一个IPC端点,那么第二个进程就会悄悄地从第一个进程中窃取绑定。 这个“功能”是为了让进程在崩溃后轻松恢复。

这就是为什么只有一个用户正在收到消息。

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

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

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

在ZeroMQ 2.0中有一个可执行文件zmq_forwarder可以用于这个目的,在2.1中指的是zmq_device(3)函数。