2009-06-28 19 views
2

多くのクライアントが中央サーバーに接続するアプリケーションを設計しています。このサーバーはこれらの接続を維持し、30分ごとにキープアライブを送信します。サーバーには、クライアント接続(例:http://server/isClientConnected?id=id)へのインターフェースを提供する組み込みHTTPサーバーがあります。私はこれについてどうやって行くのが最善の方法だろうと思っていました。私の現在の実装はJavaであり、IDのキーをキーにしたマップがありますが、スレッドごとに接続が開始されていますが、これが本当に最適な方法かどうかはわかりません。任意のポインタが評価されるだろう。
おかげで、
アイザック・ウォーラー多くの永続接続を持つサーバーを設計する方法

答えて

6

このページで説明されているように、java.nioパッケージを使用してください:Building Highly Scalable Servers with Java NIO。また、このページを非常に慎重に読んでください:Architecture of a Highly Scalable NIO-Based Server

個人的に私はNIOの内部を気にする必要はなく、Apache MINAまたはxSocketのようなフレームワークを使用します。 NIOは非常にわかりにくい方法で間違ってしまうのは複雑で簡単です。それが「うまくいく」ようにするには、フレームワークを使用します。

2

クライアントが長時間接続する場合、クライアントごとにスレッドを割り当てることが問題となる可能性があります。サーバー上の各スレッドには、一定量のリソース(スタックのメモリなど)が必要です。

Jetty Continuationsを使用すると、非同期サーブレットを使用して、より少ないスレッドでクライアント要求を処理できます。

3

接続ごとに1つのスレッドを使用すると、通常、1台のマシンで最大10,000の接続を拡張できます。 Windows 32マシンの場合、おそらく1,000回程度の接続制限が発生します。

これを回避するには、プログラムのデザインを変更するか、スケールアウト(水平)することができます。開発コストとハードウェアのコストを重視する必要があります。

通常、単一の連続接続で、ユーザーあたり1つのスレッドが最も簡単なプログラミングモデルです。私はあなたの現在のハードウェアの限界に達するまで、このモデルに固執します。その時点で、私はコードを変更するか、ハードウェアを追加するかのどちらかを決めます。

0

リアクターパターンについて詳しくは、こちらをご覧ください。 Javaの実装があります(クライアントのスレッドの代わりにチャネルを使用します)。 実装が簡単で効率的です。

関連する問題