1

私は比較的初心者のプログラマーであり、Java にも慣れていません。2 種類のアプリケーションを実行する分散システムの作成を任されています。単一の「サーバー/ルーター」と、必要な数のクライアントサーバー「ノード」。

-サーバー/ルーターは、クライアント接続情報のテーブルを維持します

-ノードは、スポーン時にそれぞれ接続情報を送信します

- ノード A は、ノード B からファイル F を要求できます。

---このリクエストはルーターに送信され、ルーターは B の接続情報を検索し、F にリクエストを送信します。

---B はルーターへの F のストリーミングを開始し、ルーターは F を A にストリーミングします。

それが一般的な考え方です。私がこれまで分散コンピューティングを行ったことがないという事実がなければ、それはかなり単純なように思えます...したがって、私の質問はコードを修正する方法の1つではなく、私の設計が機能するかどうかです(そしてそうでない場合は、どうすれば修正できますか)

したがって、私の考えは、パブリック クラス AVRouter、別のクラス AVNodeInfo、および 3 番目のクラス ConnectionMap を作成することです。AVRouter には、各ノードの名前、ポート番号、および IP アドレスを含む AVRouterInfo オブジェクトのコレクションがあります。また、ConnectionMap オブジェクトのキューもありますが、これについてはすぐに説明します。

AVRouter には、ノードが起動したときにノードから接続情報を受信し、その AVNodeInfo テーブルにそのデータを入力する専用の ServerSocket があります。ファイル要求用に別のポートがあります。リクエスターとレスポンダーの接続情報を使用して、キューに追加する ConnectionMap オブジェクトを生成します。

キューに ConnectionMaps がある間、転送を容易にするために最初のものを使用するという考えです。

最後のクラス AVNode はもっと単純です。スポーン時にその情報をルーターに送信し、ユーザー入力が別のノードとそのノードから要求したいファイルに名前を付けるのを待ちます。ルーターが利用可能になると、完成したリクエストをルーターに送信します。

AVNodeInfo テーブルを処理するためのロジックは、おそらくタイムアウトで処理されます。ノードが要求を行ってから X 時間経過すると、ノードは自動的に終了し、テーブルはテーブルからノードを削除します...これは小規模な概念実証タイプのプロジェクトであるため、この核心を扱う範囲にはまだありません。

だから私は実際に2つの質問があります:

1) このデザインは大丈夫ですか、それとも改善する必要がありますか?

2) ソース A からルーター B を介して宛先 C へのストリーミング データを、A から B へ、次に B から C への転送を実際に完了することなく、どのように正確に処理しますか?

この質問が StackOverflow の範囲内であることを願っています。コードではなくデザインであることはわかっていますが、十分に具体的だと思います。

4

1 に答える 1

0

プリンシパルの概念は非常に適切に聞こえますが、おそらく実装が最も簡単です (落とし穴が最も少ない)。実質的に標準的なアプローチです。

ファイルをノードからサーバーに送信してから、要求元のノードに転送するのではなく、ノードを相互に直接接続することを検討することをお勧めします。ノード A はサーバーにファイル Fの場所を尋ね、ノード B に直接接続します (データがより短いルートを移動するため、ネットワーク負荷が軽減されるはずです)。ただし、かなり複雑になります (各ノードは他のノードに到達できなければならずそれによって各ノードがサーバーになります)。複合的なアプローチは、直接接続を試み、それが失敗した場合はサーバー経由の方法にフォールバックすることです。

元のコンセプトを実装するだけで、それが機能するようになったら、その拡張機能が必要かどうかを確認してください。

編集:私はおそらく NodeInfo と Connection (NodeInfo のメンバーとしての接続) を融合します - サーバーは各ノードへの接続を 1 つだけ持つ必要があります (または、複数の接続を使用している場合は、NodeInfo にその特定のノードへの開いている接続のコレクションを保持させます)。

編集:あなたのコンセプトの実用性を高めるために。それは一般的に、BitTorrent のような P2P 共有プログラムが実装するものです。「トラッカー」は、各クライアントに他のピアについて伝える最初の「ルーター」として機能します。その後、ピアは直接接続を使用して互いに通信します。つまり、あなたが思いついたものと実質的に同じですが、サーバー/ルーターをブリッジとして使用するデータトラフィックがないだけです (明らかな帯域幅の問題のため、P2P のアイデアと矛盾します)。

于 2013-10-24T16:23:51.480 に答える