首页 文章

使用ZeroMQ的倒置PUB / SUB问题

提问于
浏览
6

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

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

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

我希望发布商的消息能够覆盖每个订阅者 .

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

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

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

3 回答

  • 6

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

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

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

  • 2

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

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

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

  • 4

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

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

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

相关问题