我正在尝试使用ZeroMQ设置“倒置”PUB / SUB .
意味着订阅(SUB)套接字属于几个长期存在的服务器,做 zmq_bind()
;和发布(PUB)套接字是一个短命的客户端,并且 zmq_connect()
.
我使用一个 ipc://
套接字 .
我希望发布商的消息能够覆盖每个订阅者 .
问题:只有一个订阅者进程收到消息 . 如果该过程消失,发布者会陷入 zmq_term()
.
这种操作模式是否受zmq支持?如果是,那么我做错了什么?如果没有,那么如何实现我需要的东西?
带有一些额外细节的最小例子(在Lua中,但这不应该重要):https://gist.github.com/938429
3 回答
你不能将多个套接字绑定到一个
ipc://
地址(我们在这里谈论Unix域套接字ipc:///tmp/test.ipc == file /tmp/test.ipc) .您可以做的是将每个SUB套接字绑定到不同的ipc://地址,并让发布者将一个PUB套接字连接到每个这些地址 . ZeroMQ允许一个套接字绑定/连接到多个地址 .
zmq_term()上的阻塞最有可能导致延迟关闭问题(即,存在PUB套接字尝试发送的消息) . 看一下ZMQ_LINGER套接字选项 .
有一个ipc:// transport的“特性”,即如果两个进程绑定到同一个IPC endpoints ,第二个进程将默默地从第一个进程中窃取绑定 . 这个“功能”是为了让进程在崩溃后轻松恢复 .
这就是为什么只有一个用户收到消息 .
由于您只有一个发布者,为什么不绑定发布者,并将订阅者连接到该发布者?即使发布者来来去去,订阅者也会自动重新连接 .
您无法将多个套接字绑定到一台计算机上的同一地址,无论是ipc还是tcp,SUB / PUB还是REQ / REP . 它就像网络套接字的绑定 .
从许多发布者向所有订阅者发送消息的方法是实现一个简单的代理,它绑定到SUB地址和PUB地址 . 发布者连接到SUB套接字以发送消息,订阅者连接到同一代理的PUB套接字,并且代理只是将从SUB套接字接收的所有消息转发到PUB套接字 . 它需要一些性能开销,但很容易编程 .
在ZeroMQ 2.0中,有一个可执行的zmq_forwarder可以用于此目的,在2.1中引用zmq_device(3)函数 .