我正在尝试使用ZeroMQ设置“倒置”PUB / SUB。
意味着订阅(SUB)套接字属于几个长期存在的服务器,执行zmq_bind()
;和发布(PUB)套接字是一个短命的客户端,zmq_connect()
。
我使用一个ipc://
套接字。
我希望发布商的邮件能够覆盖每个订阅者。
问题:只有一个订阅者进程收到消息。如果该流程终止,则发布商会陷入zmq_term()
。
这种操作模式是否受zmq支持?如果是,那么我做错了什么?如果没有,那么如何实现我需要的东西呢?
包含一些其他详细信息的最小示例(在Lua中,但这无关紧要):https://gist.github.com/938429
答案 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)函数。