2011-09-14 14 views
3

新しいプロジェクトでは、サーバーアプリケーションを実装する必要があります。このサーバーは50,000(+)のクライアントの接続要求を取得します。問題は、これらの接続を開いたままにして、どこかで管理する必要があることです。アプリケーションは電話交換のように動作するはずです。したがって、接続されているクライアントの要求を取得し、それらが接続されている場合にのみ、他の(多分複数の)クライアントに接続することもできます。独自のプロトコルが使用されています。私の質問は次のとおりです:Javaサーバーアプリケーションでの複数ソケット接続の管理

オープンソケットをどのように(そしてどこで)管理するのですか?私はそれらをHashMapまたは何かに置くべきでしょうか?これは私にとって好奇心をそそられます。しかし、私は非常に多くのオープンな接続での経験はありません。

この接続要件をサポートするフレームワークはありますか?

ありがとうございました!

+0

Netty(http://www.jboss.org/netty)が最適です。 – bravit

答えて

6

オープンソケットをどのように(またどこで)管理するのですか?私はそれらをHashMapまたは何かに置くべきでしょうか?

通常、各ソケットは、ソケットの読み取りと書き込みを担当するスレッドによって管理されます。また、あらかじめ定義されたネットワークインターフェイス&ポート(すべての接続要求をServerSocket APIクラスを使用)で受け取る責任を負うマスタースレッドがあり、実際の処理作業をワーカー/スレーブスレッドに渡すことができます。この場合、ワーカースレッド用のスレッドプールを調べるべきです。なぜなら、50kスレッドを作成するとOSとハードウェアが圧倒される可能性が高いからです。

また、実際に50kコンカレントソケットを管理している場合は、JavaのプレーンIO APIでNIO API(java.nio。*)を使用することを強くお勧めします。 5k同時接続。 Javaの世界にはNIOベースのフレームワークが2つ知られています(Apache MINAJBoss Netty)。私はwell written NIO tutorialを読む前に、NIO APIまたはNIOフレームワークを使用することをお勧めします。

+1

すてきな書き込み。あなたが言ったことに追加するために、サーバーソケットは、開いているファイルハンドルのようなもので、各OSは現在同時に開いているソケットの数に制限があります。このやその他のリソース管理を一から扱うことは大きな苦痛になるでしょう。これが、Apache MINAやJBoss Nettyのようなプロジェクトが生まれた理由です。 – Santosh

+1

@Santosh、はい、オープンファイルハンドル(およびネットワーク帯域幅)に関する部分は、50kコンカレントソケットが実現するのが難しい理由です。 [このNettyベンチマーク](http://www.jboss.org/dms/netty/performance/20081006-tlee/performance.pdf)は、あらゆるフレームワークで1Gbイーサネットリンクを飽和させることがいかに簡単かを示しています。ボックスには、50kの同時接続を得るために、いくつかのギガビットイーサネットリンクが必要です。 –

関連する問題