ここで探していることを行うことができますが、システムを乱用して意図しない方法で動作させないでください。そうしないと、メンテナンスの悪夢を自分で作成することになります. この場合の「遠すぎる」の境界線は、開発チームやプロジェクトごとに異なりますが、覚えておいてください。
提案されたパターンで問題が発生するいくつかの理由を次に示します。
- DEALER ソケットは、他の 2 つのソケットとピアリングされています。DEALER ソケットはラウンドロビン方式でデータを送信するため、1 つのメッセージを REP ソケットに送信し、次のメッセージを ROUTER ソケットに戻します。おそらくあなたが望むものではありません。
- 明確なサーバー ソケット (使用する
bind()
) またはクライアント ソケット (使用する) はありませんconnect()
。提案されたパターンでは、ソケットの合計が偶数であるためうまくいきますが、チェーン内のソケットを追加または削除すると、次のシナリオに遭遇します。
-
SOCKET A -> SOCKET B -> SOCKET C -> (SOCKET A)
CLIENT SERVER CLIENT ( CLIENT )
CONNECT BIND CONNECT ( CONNECT)
別のソケットconnect()
に接続できないソケットconnect()
。2 つのソケットと同じですbind()
。
- REQ ソケットは要求を送信したソケットからの応答を期待し、REP ソケットは要求を送信したソケットに応答するという概念を破ろうとしています。それが可能であれば(私はそれを調べていません)、それは「遠すぎる」と「メンテナンスの頭痛を期待する」という私のラインになります。
... これが私のアドバイスです。
- 持っていない、または持っていない場合は、ガイドをお読みください。
- メッセージング プロトコルは難しいものです。それらは簡単であるように見えますが、間違いを犯しやすいです。これが、効率が悪いと思われる場合でも、市販のプロトコルを使用することをお勧めする理由です。
- 時期尚早に最適化しないでください。おそらく、余分なネットワーク遅延がボトルネックになることはありません. 実際にどれだけのデータを渡していますか? 大部分のデータをオフロードする方法はありますか? たとえば、メッセージごとに MB のデータを送信する場合、中央からアクセス可能なリポジトリに保存し、メッセージで URI を送信するだけでよいでしょうか?
- ガイドには多数のメッセージング プロトコルが記載されており、ZMQ リソース サイトで無料で配布されています。それらはテストされ、適切に設計されています。それらがうまくいかない場合を除き、試してみてください。
提案したメッセージング パターンを機能させたい場合は、それにソケットを追加する必要があります。各プロセスは着信ソケットと発信ソケットを所有する必要があります (これにより、常に偶数のソケットが存在し、bind()
ing とconnect()
ing が管理可能であることが保証されます。ソケットの種類ごとに適切なメッセージングを維持できます (REQ と REP の期待を壊すことはありません)。 ) 通信の残りの半分をピックアップする別のソケットを追加する. しかし、実際には、既存のプロトコルを調べて、それらが機能しないことと、その理由を最初に判断する必要があります.