クライアントはどのようにしてzeromqでの応答をサブスクライブおよびリッスンできますか?つまり、クライアント側では、メッセージを受信して選択的にリクエストを送信するループを実行し、サーバー側では、ほとんどの場合公開したいのですが、リクエストを受信することもあります。通信モードごとに1つずつ、合計2つの異なるソケットが必要になるようです。それを回避し、サーバー側で、自分のスレッドのソケットにメッセージをプッシュしているときに、zeromqコールバックスレッドのソケットから「要求通知」を受信することは可能ですか?
3 に答える
私はZeroMQに非常に慣れていないので、あなたが望むものがベストプラクティスと見なされるかどうかはわかりません。ただし、複数のソケットを使用するソリューションは、を使用すると非常に簡単zmq_poll
です。
基本的な考え方は、クライアントとサーバーの両方を持つことです。
- pub/sub用のソケットを開きます
- req/rep用のソケットを開きます
zmq_poll
マルチプレックスは、無限ループを使用して、ループ内の2つのソケット間で送受信します- ループ内でreq/repイベントとpub/subイベントが発生したときにそれらを処理します
複数のソケットでこのように使用zmq_poll
すると、スレッドが完全に回避されるため便利です。0MQガイドにはここに良い例があります。この例では、-1
inのタイムアウトを使用しzmq_poll
ているため、多重化されたソケットのいずれかで少なくとも1つのイベントが発生するまでブロックされますが、ループで実行する必要がある場合は、xミリ秒などのタイムアウトを使用するのが一般的です。他のいくつかの作品も同様です。
2つのスレッドを使用して、さまざまなソケットを処理できます。課題は、スレッド間でデータを共有する必要がある場合、安全な方法でデータを同期する必要があることです。
別の方法は、ZeroMQ Pollerを使用して、新しいデータがあるソケットを選択することです。このプロセスでは、bjlaubが説明した方法で単一のループを使用します。
これは、 Majordomoプロトコルのバリエーション/サブセットを使用して実現できます。アイデアは次のとおりです。
サーバーはルーターソケットになり、クライアントはディーラーソケットになります。サーバーに接続すると、クライアントはある種のサブスクリプションまたは「hello」メッセージ(設計の)を送信する必要があります。サーバーはそのパケットを受信しますが、(ルーターソケットであるため)そのクライアントのIDも受信します。サーバーが(設計を通じて)そのクライアントに何かを送信する必要がある場合、サーバーはそれをそのIDに送信します。ディーラーソケットなので、クライアントは自由に送受信できます。