3

Java TCP / IPソケットで複数のリクエストを処理するのは非常に簡単ですか. メッセージを受け取ってスレッドを生成するだけです。別のメッセージを受け入れて、別のスレッドを生成します。問題は、スレッドの生成を開始すると、物事がより非決定的になるということです。10 のクライアントがあり、1 つのクライアントがリクエストを発行し続け、残りの 9 9 がハイパーアクティブ クライアントの 10% パーセントでリクエストを送信すると、調べるのが難しくなるとします。

これを処理する 1 つの方法は、すべてのクライアントが対応するセマフォを持つサーバーにセマフォのハッシュマップを用意することです。クライアントのリクエストを処理する前に、セマフォを通過させ、各クライアントが一度に特定の数のリクエストのみを持つことができるようにセマフォを構成できます。

この段階では、うまくいくと思いますが、これを行うより良い方法やライブラリはありますか?

4

1 に答える 1

5

...しかし、より良い方法はありますか...?

サーバーソケットごとに 1 つの受け入れスレッドと、事前に生成されたスレッドのプールを使用してワークロードを処理します。受け入れスレッドは接続のみを受け入れ (他には何もしません)、プール内のスレッドの 1 つにハンドラー ソケットを渡します。そのスレッドは、クライアントが完了するまでハンドラ ソケットで動作し、その後ハンドラ ソケットを閉じます。

このセットアップは、好きなだけスケールアウトできます。受け入れスレッドがほとんどの時間プール スレッドを待機していることに気付いた場合は、プール スレッドの数を 2 倍にする必要があります。スレッドは、(A)別の受け入れスレッドと(B)接続を受け入れる別のソケットの両方を作成し、オプションで(C)これらを別のマシンに配置するボトルネックです。

クライアントが他のクライアントよりも重要である場合、ハイパーアクティブなクライアントで説明している特定の問題は、意図されている/望まれている可能性があります。その場合、何もする必要はありません。または、サービス拒否攻撃と見なすこともできます。この場合、クライアントを切断し、その IP アドレスを一時的に禁止するだけのヒューリスティックが必要です。

于 2012-10-19T09:48:13.843 に答える