2011-07-16 13 views
11

クライアントはどのようにしてzeromqで返信を購読して聞くことができますか? つまり、クライアント側では、メッセージを受信して​​選択的に要求を送信するループを実行したいと思います。サーバー側では、ほとんどの時間を公開したいのですが、時には要求も受け取ることがあります。 私は2つの異なるソケットを持つ必要があるように見えます - それぞれの通信モードに1つ。それを避けることは可能ですか?サーバサイドでは、自分のスレッドでソケットにメッセージをプッシュしている間に、ゼロリクエストコールバックスレッドのソケットから「リクエスト通知」を受け取りますか?zeromqでreq/repとpub/subを組み合わせる

答えて

14

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

基本的な考え方は、クライアントとサーバーの両方を持っているだろう:

  • サブパブ/用のソケットを開く
  • REQ /担当者のためのソケットを開くマルチプレックスは、2つのソケットの間で送受信します彼らが起こるようにループ内の無限ループに
  • プロセスREQ/repおよびパブ/サブイベントをzmq_pollを用いてループ内

zmq_pollを複数のソケットでこのように使用すると、スレッドを完全に避けることができます。 0MQガイドはgood example hereです。この例では、zmq_pollにタイムアウト値-1を使用しているため、マルチプレックスされたソケットで少なくとも1つのイベントが発生するまでブロックされますが、ループが必要な場合はタイムアウト値としてxミリ秒他にもいくつかの仕事をしています。

2

2つのスレッドを使用して、異なるソケットを処理できます。スレッド間でデータを共有する必要がある場合は、安全に同期させる必要があります。

代わりに、ZeroMQポーラーを使用して、新しいデータを持つソケットを選択することができます。このプロセスでは、bjlaubが説明した方法で単一のループを使用します。

+0

私はRubyでスレッドを試しました。最初のsocket.recvはメイン(アプリケーション)を含むすべてのスレッドをブロックします... – MickaelFM

+0

@MickTaiwan Rubyのバインディング、Rubyのスレッド、またはあなたのコードに問題があります。私はスレッドを使用して、Javaで異なるソケットを使用しています。 – Joshua

+0

私はスレッドで動作するいくつかの例を読んでいますが、 "ffi-rzmq"ではなく、ruby gem "zmq"ではありません。 – MickaelFM

1

これは、Majordomo Protocolのバリエーション/サブセットを使用して達成できます。

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

関連する問題