クライアントはどのようにしてzeromqで返信を購読して聞くことができますか? つまり、クライアント側では、メッセージを受信して選択的に要求を送信するループを実行したいと思います。サーバー側では、ほとんどの時間を公開したいのですが、時には要求も受け取ることがあります。 私は2つの異なるソケットを持つ必要があるように見えます - それぞれの通信モードに1つ。それを避けることは可能ですか?サーバサイドでは、自分のスレッドでソケットにメッセージをプッシュしている間に、ゼロリクエストコールバックスレッドのソケットから「リクエスト通知」を受け取りますか?zeromqでreq/repとpub/subを組み合わせる
答えて
私はZeroMQを新しくしているので、あなたが望むものがベストプラクティスかどうかは分かりません。しかし、複数のソケットを使用するソリューションは、zmq_poll
を使用すると非常に簡単です。
基本的な考え方は、クライアントとサーバーの両方を持っているだろう:
- は
- サブパブ/用のソケットを開く
- REQ /担当者のためのソケットを開くマルチプレックスは、2つのソケットの間で送受信します彼らが起こるようにループ内の無限ループに
- プロセスREQ/repおよびパブ/サブイベントを
zmq_poll
を用いてループ内
zmq_poll
を複数のソケットでこのように使用すると、スレッドを完全に避けることができます。 0MQガイドはgood example hereです。この例では、zmq_poll
にタイムアウト値-1
を使用しているため、マルチプレックスされたソケットで少なくとも1つのイベントが発生するまでブロックされますが、ループが必要な場合はタイムアウト値としてxミリ秒他にもいくつかの仕事をしています。
2つのスレッドを使用して、異なるソケットを処理できます。スレッド間でデータを共有する必要がある場合は、安全に同期させる必要があります。
代わりに、ZeroMQポーラーを使用して、新しいデータを持つソケットを選択することができます。このプロセスでは、bjlaubが説明した方法で単一のループを使用します。
これは、Majordomo Protocolのバリエーション/サブセットを使用して達成できます。
サーバーはルータソケットになり、クライアントはディーラーソケットになります。サーバーに接続すると、クライアントは何らかの種類のサブスクリプションまたは "hello"メッセージ(デザインの)を送信する必要があります。サーバはそのパケットを受信するが(router socket)、そのクライアントのIDも受信する。サーバーが(設計を通じて)そのクライアントに何かを送信する必要がある場合、サーバーはそのIDにそれを送信します。クライアントはディーラーソケットであるため、自由に送受信できます。
- 1. データウェアハウス:冗長な組み合わせの組み合わせ
- 2. mod_accessとmod_authを組み合わせる
- 3. * -servlet.xmlとapplicationContext.xmlを組み合わせる
- 4. DIとコンストラクタパラメータを組み合わせる?
- 5. ctypesとswigを組み合わせる
- 6. asmxとCodeBehindを組み合わせる
- 7. ec2とlinodeを組み合わせる
- 8. itertoolsとマルチプロセッシングを組み合わせる?
- 9. AQGridViewとHJCacheを組み合わせる
- 10. メテオとエクスプレスを組み合わせる
- 11. link_toとrender:partialを組み合わせる
- 12. ドラッグアンドドロップとスケーリングを組み合わせる
- 13. intをvoidと組み合わせる*
- 14. コンパススプライトでクラスセレクタを組み合わせる?
- 15. wgetとPHPを組み合わせた
- 16. 組み合わせ質問
- 17. 組み合わせmysql mongodb
- 18. ロックの組み合わせ
- 19. 組み合わせ条件
- 20. 組み合わせ変数
- 21. 組み合わせが
- 22. 組み合わせ選択
- 23. ワイアードの組み合わせ
- 24. 2-組み合わせC++
- 25. geom_pointとgeom_lineをggplot2のggplot2と組み合わせて2つのグループ化要因を組み合わせる
- 26. インラインプラグマとタイプクラスの組み合わせ
- 27. ISupportInCrementalLoadingとVariableSizedWrapGridの組み合わせ
- 28. Luceneクエリとアナライザの組み合わせ
- 29. ブレークポイントとirb(REPL)の組み合わせ
- 30. tail -Fとjsonの組み合わせ
私はRubyでスレッドを試しました。最初のsocket.recvはメイン(アプリケーション)を含むすべてのスレッドをブロックします... – MickaelFM
@MickTaiwan Rubyのバインディング、Rubyのスレッド、またはあなたのコードに問題があります。私はスレッドを使用して、Javaで異なるソケットを使用しています。 – Joshua
私はスレッドで動作するいくつかの例を読んでいますが、 "ffi-rzmq"ではなく、ruby gem "zmq"ではありません。 – MickaelFM