6

ZeroMQ で「反転」PUB/SUB をセットアップしようとしています。

サブスクライブ (SUB) ソケットがいくつかの長寿命サーバーに属していることを意味しますzmq_bind()。パブリッシング (PUB) ソケットは短命のクライアントであり、zmq_connect().

シングルipc://ソケットを使用しています。

出版社からのメッセージが各購読者に届くことを期待しています。

問題: サブスクライバ プロセスの 1 つだけがメッセージを受信します。そのプロセスが停止すると、パブリッシャーはzmq_term().

この操作モードは zmq でサポートされていますか? はいの場合、私は何が間違っていますか? いいえの場合、必要なものを実装する方法は?

いくつかの追加の詳細を含む最小限の例 (Lua では、これは重要ではありません): https://gist.github.com/938429

4

3 に答える 3

6

複数のソケットを 1 つのアドレスにバインドすることはできませんipc://(ここでは、Unix ドメイン ソケットについて話している ipc:///tmp/test.ipc == file /tmp/test.ipc)。

できることは、各 SUB ソケットを異なる ipc:// アドレスにバインドし、パブリッシャに 1 つの PUB ソケットをそれらのアドレスのそれぞれに接続させることです。ZeroMQ では、1 つのソケットが複数のアドレスにバインド/接続できます。

zmq_term() のブロックは、クローズの問題が長引く可能性が高い (つまり、PUB ソケットが送信しようとしているメッセージがある)。ZMQ_LINGERソケット オプションを見てください。

于 2011-04-23T07:58:44.743 に答える
2

ipc または tcp、SUB/PUB、REQ/REP のいずれであっても、1 台のマシンで複数のソケットを同じアドレスにバインドすることはできません。これは、ネットワーク ソケットのバインドのようなものです。

多くのパブリッシャーからすべてのサブスクライバーにメッセージを送信する方法は、SUB アドレスと PUB アドレスにバインドする単純なブローカーを実装することです。パブリッシャーは SUB ソケットに接続してメッセージを送信し、サブスクライバーは同じブローカーの PUB ソケットに接続します。ブローカーは、SUB ソケットから受信したすべてのメッセージを PUB ソケットに転送するだけです。パフォーマンスのオーバーヘッドが多少かかりますが、プログラミングは非常に簡単です。

ZeroMQ 2.0 には、実行可能な zmq_forwarder があり、この目的のためにのみ使用できます。2.1 では zmq_device(3) 関数を参照してください。

于 2011-04-25T10:51:14.567 に答える