使用ZeroMQ的倒置PUB / SUB问题

时间:2011-04-23 07:04:59

标签: linux ipc publish-subscribe zeromq

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

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

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

我希望发布商的邮件能够覆盖每个订阅者。

问题:只有一个订阅者进程收到消息。如果该流程终止,则发布商会陷入zmq_term()

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

包含一些其他详细信息的最小示例(在Lua中,但这无关紧要):https://gist.github.com/938429

3 个答案:

答案 0 :(得分:6)

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

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

zmq_term()上的阻塞最有可能导致延迟关闭问题(即,存在PUB套接字尝试发送的消息)。看一下ZMQ_LINGER套接字选项。

答案 1 :(得分:4)

ipc:// transport有一个'功能',即如果两个进程绑定到同一个IPC端点,第二个进程将默默地从第一个进程中窃取绑定。这个“功能”是为了让进程在崩溃后轻松恢复。

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

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

答案 2 :(得分:2)

您无法将多个套接字绑定到一台计算机上的同一地址,无论是ipc还是tcp,SUB / PUB还是REQ / REP。它就像网络套接字的绑定一样。

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

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