質問

多くのクライアントが中央サーバーに接続するアプリケーションを設計しています。このサーバーはこれらの接続を維持し、30 分ごとにキープアライブを送信します。サーバーには HTTP サーバーが組み込まれており、クライアント接続 (例: http://server/isClientConnected?id=id)。これについてはどうするのが最善なのか考えていました。現在の実装は Java であり、キーとして ID を含む Map を持っているだけですが、接続ごとにスレッドが開始されるため、これが本当に最適な方法であるかどうかはわかりません。ご指摘をいただければ幸いです。
ありがとう、
アイザック・ウォーラー

役に立ちましたか?

解決

このページで説明されているように、java.nio パッケージを使用します。 Java NIO を使用した拡張性の高いサーバーの構築. 。このページもよく読んでください。 拡張性の高い NIO ベースのサーバーのアーキテクチャ.

個人的には、NIO の内部構造には気にせず、次のようなフレームワークを使用したいと思います。 アパッチMINA または xソケット. 。NIO は複雑で、非常にわかりにくい点で間違いやすいです。「そのまま動作」させたい場合は、フレームワークを使用します。

他のヒント

あなたは、通常、単一のマシン上で約10,000の接続にスケールアップすることができ、接続ごとに単一のスレッドで。 Windowsの32機の場合、あなたはおそらく千個の接続周りの制限をヒットします。

これを避けるために、あなたはあなたのプログラムの設計を変更するか、またはあなたが(横)スケールアウトすることができます。あなたは、ハードウェアのコストと開発コストを重み付けする必要があります。

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

クライアントが長時間接続される場合は、

、クライアントごとにスレッドを割り当てることが問題となる可能性があります。サーバ上の各スレッドが(例えば、スタックのためのメモリ、)リソースの一定量を必要とする。

あなたは桟橋継続のは、使用して少数のスレッドを持つクライアント要求を処理するためにを使用することができます非同期サーブレットます。

原子炉のパターンについては、こちらをご覧ください。 Javaでそのための実装があります(これは、クライアントのためのチャネルの代わりに、スレッドを使用しています)。 実装が容易で、非常に効率的である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top