14

クライアントはどのようにしてzeromqでの応答をサブスクライブおよびリッスンできますか?つまり、クライアント側では、メッセージを受信して​​選択的にリクエストを送信するループを実行し、サーバー側では、ほとんどの場合公開したいのですが、リクエストを受信することもあります。通信モードごとに1つずつ、合計2つの異なるソケットが必要になるようです。それを回避し、サーバー側で、自分のスレッドのソケットにメッセージをプッシュしているときに、zeromqコールバックスレッドのソケットから「要求通知」を受信することは可能ですか?

4

3 に答える 3

16

私はZeroMQに非常に慣れていないので、あなたが望むものがベストプラクティスと見なされるかどうかはわかりません。ただし、複数のソケットを使用するソリューションは、を使用すると非常に簡単zmq_pollです。

基本的な考え方は、クライアントとサーバーの両方を持つことです。

  • pub/sub用のソケットを開きます
  • req/rep用のソケットを開きます
  • zmq_pollマルチプレックスは、無限ループを使用して、ループ内の2つのソケット間で送受信します
  • ループ内でreq/repイベントとpub/subイベントが発生したときにそれらを処理します

複数のソケットでこのように使用zmq_pollすると、スレッドが完全に回避されるため便利です。0MQガイドにはここに良い例があります。この例では、-1inのタイムアウトを使用しzmq_pollているため、多重化されたソケットのいずれかで少なくとも1つのイベントが発生するまでブロックされますが、ループで実行する必要がある場合は、xミリ秒などのタイムアウトを使用するのが一般的です。他のいくつかの作品も同様です。

于 2011-07-16T17:26:25.923 に答える
2

2つのスレッドを使用して、さまざまなソケットを処理できます。課題は、スレッド間でデータを共有する必要がある場合、安全な方法でデータを同期する必要があることです。

別の方法は、ZeroMQ Pollerを使用して、新しいデータがあるソケットを選択することです。このプロセスでは、bjlaubが説明した方法で単一のループを使用します。

于 2011-07-19T23:06:32.727 に答える
1

これは、 Majordomoプロトコルのバリエーション/サブセットを使用して実現できます。アイデアは次のとおりです。

サーバーはルーターソケットになり、クライアントはディーラーソケットになります。サーバーに接続すると、クライアントはある種のサブスクリプションまたは「hello」メッセージ(設計の)を送信する必要があります。サーバーはそのパケットを受信しますが、(ルーターソケットであるため)そのクライアントのIDも受信します。サーバーが(設計を通じて)そのクライアントに何かを送信する必要がある場合、サーバーはそれをそのIDに送信します。ディーラーソケットなので、クライアントは自由に送受信できます。

于 2016-05-03T19:44:23.490 に答える