10

質問

TCP経由で2つのプロセスを接続したいのですが、どちらがサーバーでどちらがクライアントであるかを指定する必要はありませんが、お互いのIPとホストを知っています。どちらがサーバーでどちらがクライアントであるかを独自に決定し、接続を開始する必要があります。

バックグラウンド

私は、RPC とは対照的に、クライアント/サーバー モデルがない双方向分散フレームワークに取り組んでいます。代わりに、分散コンポーネントは、ホストとポートを指定することで互いに通信できるようにする必要があります。

編集:概念は、ソケット接続の実装の詳細を超えています。これは、ソフトウェア エンジニアリングの観点から分散アプリケーションの設計を簡素化するための新しい概念です。これは、RPC や SOA (サーバー/クライアント指向) やメッセージ指向システム (IMO 非直感的なパターンの使用を要求する) とは対照的です。

ソリューションは、

  • TCP の信頼性と SSL の使用の可能性が必要なため、UDP 経由でプロトコルを定義する
  • ターゲット プラットフォームでバイナリ パッケージを使用できないため、ZeroMQ のようなフレームワークを使用する
  • edit : グローバル メッセージ ブローカー / ネーム サーバー。追加のプロセスを必要としない軽量なソリューションであるためです。そして、そのようなノードを追加すると、クライアント/サーバーの概念が再導入されるだけです

アップデート

議論の結果、有用なアプローチは 1 つしかないように思われます。すべてのピアにリスト ソケットが必要です (または、もちろん自動検出を行うことはできません)。接続要求時に、まだ開いている接続がない場合、ノードは他のピアへの接続を試みます。

これは、接続が同時に行われる場合に問題になる可能性があるため、2 つのピア間で 2 つの接続が発生することになります。問題は、非同期コンテキストでそれを処理する方法です。1 つの接続のみが閉じられていることを保証する必要があるため、これは以下のコメントで述べたほど簡単ではないと思います。この作業には 2PC のようなプロトコルが必要だと思います。

4

2 に答える 2

2

2つのピアがお互いを見つけたい場合は、次のいずれかを調べる必要があります。

  • ブロードキャストスキーム:zeromqは機能しますが、それを使用できない場合は、IPマルチキャストを使用してみてください。
  • あなた自身の発見サービス

ピアツーピアアプリケーションのブートストラップには、上記のいずれかが必要になります。ほとんどの場合、Webを使用してBittorrent TrackerのURLを「ブロードキャスト」し、ピアがお互いを見つけるのに役立ちます。

要件を考慮して、IPマルチキャストを調べることを強くお勧めします。Twisted(http://twistedmatrix.com/documents/current/core/howto/udp.html)を使用して、単純なUDPプロトコルを作成しました。これを使用して、デスクトップマシンでマスタープロセスを起動し、一連のリモートマシンで複数のワーカープロセスを起動して、サイトの負荷テストを調整しました。些細なことではありませんが、非常にうまく機能します。

重要なのは、独自の単純なワイヤープロトコルを定義する必要があるということです。単純なネットストリング(+)のようなものも可能です。シリアル化を容易にし、メッセージ内のメタデータを簡単にエンコードできるようにするために、JSONのような単純な構造化メッセージ形式を使用します。

2つのUDPマルチキャストポートを使用すると、より簡単な時間が得られます。1つは検出用で、もう1つはノード間で送信するメッセージまたはデータ用です。

それがお役に立てば幸いですが、実際に達成したいことについての詳細がなければ、より具体的にすることは困難です。

于 2012-06-06T13:31:17.383 に答える