単一のサーブレットは、ユーザーリクエストの形式で送信される複数のクライアントリクエストをどのように処理しますか?シングルトンデザインパターンに基づいて、サーブレットの単一のインスタンスが作成されることはわかっていますが、単一のサーブレットは何百万ものリクエストをどのように処理しますか。それに関係するスレッド化についても混乱しています。
また、リクエストを送信したり、リクエストに対して送信されるスレッドを生成したりするために、ブラウザの仕様や設定がここで便利になります。
それはすべてのフレームワークで同じですか、たとえばストラットとスプリングの違いはありますか?
Struts/Springフレームワークは、実際にはServlet仕様の上に記述されているため、Servletを使用する下で何を使用してもかまいません。
サーブレットの単一インスタンスのみが作成されますが、そのインスタンスは複数のスレッド間で共有されます。このため、サーブレット内で可変状態を共有しないでください。
たとえば、http://localhost/myservlet
にマッピングされた次のサーブレットがあります
class MySerlvet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) {
// Get Logic
}
}
Webサーバーのコードには、似たようなもの(必ずしも同じではない)があります。
MyServlet m = new MyServlet(); // This will be created once
// for each request for http://localhost/myservlet
executorService.submit(new RequestProcessingThread(m));
各リクエストは個別のスレッドで処理されます。これは、Tomcatがリクエストごとにスレッドを作成するという意味ではありません。要求を処理するスレッドのプールがあります。また、サーブレットごとに1つのインスタンスがあり、これがデフォルトのケースです( Some more information )。サーブレットはThread Safe
。
サーブレットがSingleThreadModel
インターフェイスを実装している場合、各スレッドはサーブレットの個別のインスタンスを使用します。 SingleThreadModel
は非推奨 、使用しないでください。
この回答はコミュニティwikiとして作成しました。
サーブレットの複数のインスタンスを作成しないでください。サーブレットエンジンは、リクエストごとに個別のスレッドを作成します(スレッドの最大数まで)。パフォーマンスは、サーブレットのインスタンスの数ではなく、スレッドの数に関連しています。
たとえば、リクエストが1000で、サーブレットが生成できる最大スレッドが100の場合、パフォーマンスが低下します。
この問題を回避するために、複数のサーバーをロードバランサーの背後に配置することでロードバランサーを使用できます。ロードバランサーは、さまざまなパラメーター/設定(ラウンドロビン分散、負荷分散など)に基づいて、いずれかのサーバーに要求を「ルーティング」するように構成する必要があります。必要な負荷が大きいほど、追加するサーバーが多くなります。ただし、これはすべてのトラフィックをロードバランサー経由で送信するため、これは冗長でフェールオーバーセーフであることが重要です。