多くのクライアントが中央サーバーに接続するアプリケーションを設計しています。このサーバーはこれらの接続を維持し、30分ごとにキープアライブを送信します。サーバーにはHTTPサーバーが組み込まれており、クライアント接続へのインターフェイスを提供します(例:http:// server / isClientConnected?id = id)。私はこれを行うための最良の方法は何であるか疑問に思いました。私の現在の実装はJavaであり、キーとしてIDを持つマップがありますが、接続ごとにスレッドが開始され、これが本当にこれを行うための最良の方法であるかどうかはわかりません。任意のポインタをいただければ幸いです。
ありがとう、
Isaac Waller
4 に答える
このページで説明されているように、java.nioパッケージを使用します:JavaNIOを使用した高度にスケーラブルなサーバーの構築。また、このページを注意深くお読みください:高度にスケーラブルなNIOベースのサーバーのアーキテクチャ。
個人的には、NIOの内部を気にせず、ApacheMINAやxSocketなどのフレームワークを使用します。NIOは複雑で、非常にあいまいな方法で間違えやすいです。「正しく機能」させたい場合は、フレームワークを使用してください。
接続ごとに1つのスレッドを使用すると、通常、1台のマシンで約10,000の接続にスケールアップできます。Windows 32マシンの場合、おそらく1,000接続前後の制限に達するでしょう。
これを回避するには、プログラムのデザインを変更するか、スケールアウト(水平)することができます。開発コストとハードウェアのコストを比較検討する必要があります。
通常、ユーザーごとに1つのスレッドを使用し、1つの連続接続を使用するのが、最も簡単なプログラミングモデルです。現在のハードウェアの限界に達するまで、このモデルを使い続けます。その時点で、コードを変更するか、ハードウェアを追加することにしました。
クライアントが長期間接続される場合、クライアントごとにスレッドを割り当てると問題が発生する可能性があります。サーバー上の各スレッドには、一定量のリソース(たとえば、スタック用のメモリ)が必要です。
Jetty Continuationsを使用すると、非同期サーブレットを使用して、より少ないスレッドでクライアント要求を処理できます。
Reactorパターンの詳細をご覧ください。Javaにはそのための実装があります(クライアントにスレッドの代わりにチャネルを使用します)。実装が簡単で非常に効率的です。