2012-02-25 8 views
3

は、私は以下のように説明した非常に簡単な言葉にすることができ、システム、開発しています:Javaを使用した分散コンピューティング。最善のアプローチ?

  1. は、複数のサーバがありますが、それぞれが(スケーラビリティのために)同じJavaアプリケーションを実行しています。
  2. 各アプリケーションサーバーが通話する共通のデータベースサーバーがあります。
  3. それぞれが1つのランダムなサーバーに接続する数百万のクライアント。各クライアントには、1つのサーバーを持つ1つのオープンソケットがあります。この種の問題のための最善のアプローチは何ですか?

今、クライアントAがサーバーAに接続されている、と言うと、クライアントBにメッセージを送信したい

どのクライアントがどのサーバーに接続されているかを追跡する最良の方法と、サーバーを互いに通信させる方法。

これはJava固有の問題です。サーバーが1つしかない場合は、スレッド間通信によって実行されている可能性があります。しかし、問題は複数のサーバーです。また、この作業を容易にするオープンソースライブラリがありますか?

+0

のような既存のjava実装をチェックアウトすることもできます。どのクライアントがどのサーバに接続されている共通データベースに格納することができます。どのプロセスIDとスレッドIDにクライアントソケットがあり、次にRMIを使ってメッセージを送信します。しかし、より効率的なソリューションはありますか? –

+0

私もこの質問に興味がありました。このためにActiveMQを使用してトピック全体のすべてのサーバーにメッセージを送信し、各サーバーでメッセージを受信するかどうか(ID受信者によって)確認できますか? – komelgman

+4

クライアントをランダムなサーバーに接続するのではなく、そのIPアドレスなどのハッシュ関数によって決定される特定のサーバーに接続するのはなぜですか? – Kru

答えて

3

クライアントの場所(おそらく専用のアドレスサーバーなど)を使用してクライアントの場所を検索する必要があるサーバーや、ハッシュアプ​​ローチやその他のランダムでないパーティショニングを使用してランダム性を削除する必要があるサーバー、コメントの中でKruのように。 (いずれにしても、サーバーがダウンした場合に問題は発生しますが、おそらくそれは問題の範囲外です)。

サーバーは、適切な他のサーバーにメッセージを転送できる必要があります。最も簡単な方法は、ソケット接続を互いに維持することです。

もう1つの方法は、メッセージキューイングシステムを使用することです。 ZeroMQのような高性能ブローカレスシステムを使用することを検討してください。これはソケットのようなAPIを提供しますが、スループットと障害許容度が高く、メッセージングパターンも豊富です。より高いレベルのメッセージング製品は、あなたがとにかく(スケーラビリティ、アドレッシングなどを扱う)システムのほとんどを実装する可能性があります。

独自の分散型メッセージングシステムを開発するのではなく、XMPPなどの既存のプロトコルを使用できる場合があります。

0

あなたは分散ハッシュテーブルを探していると思います。 Chordプロトコルを使用し、IPのハッシュをキーとして使用することができます。このキーを使用すると、プロトコルはキーを含む適切なサーバーにルーティングできます。 (クライアントBとの接続を維持するサーバー)。 http://tomp2p.net/

関連する問題