私はWebアプリケーション開発に2年以来Java(サーブレット、JSP)を使用しています。この2年間、プロジェクトでmultithreading
(明示的に-サーブレットコンテナはスレッドを使用して同じサーブレットを異なるリクエストに提供することを知っているので)を使用する必要はありませんでした。
しかし、Web Developer position(Java)のインタビューに参加するたびに、Javaのスレッドに関連するいくつかの質問があります。 Javaスレッド化の基本を知っているので、質問に答えることは問題ではありません。
私の質問は、Webアプリケーションにおけるmultithreading
の役割は何ですか? multithreading
をWebアプリケーションで使用できる例はありがたいです。
前もって感謝します。
マルチスレッドは、主に非同期呼び出しに関心があるときにWebアプリで使用できます。
たとえば、GSMネットワークでユーザーの状態をアクティブにし(4Gプランをアクティブにするなど)、確認のSMSまたはメールメッセージを最後に送信するWebアプリケーションがあるとします。
Web呼び出しに数分かかることを知っている-特にGSMネットワークにストレスがかかっている場合-Webスレッドから直接呼び出すことは意味がありません。
そのため、基本的に、ユーザーが[アクティブ化]をクリックすると、サーバーは "4Gプランをアクティブ化していただきありがとうございます。数分でプランがアクティブ化され、確認のSMS /メールを受け取ります"のようなメッセージを返します。
その場合、サーバーは、理想的にはスレッドプールを使用して、非同期方式で新しいスレッドを生成し、すぐにユーザーに応答を返す必要があります。
ワークフロー:
1-ユーザーが[アクティブ化]ボタンをクリックする
2-サーブレットは要求を受け取り、スレッドプールで新しい「4Gプランのアクティブ化」タスクをアクティブ化します。
3-サーブレットは、タスクが完了するのを待たずに、すぐにHTML応答をユーザーに返します。
4- HTTPトランザクションの終了
。 。 。
非同期的に、4Gプランは後でアクティブになり、ユーザーはSMSまたは電子メールなどを通じて通知されます...
実世界の例について言えば、マルチスレッドを使用するいくつかの理由があり、私はそれを知らないウェブ開発者を雇いません。しかし、最終的に、マルチスレッドを使用する理由は、標準開発とWeb開発で同じです:しばらくの間(別名ブロッキング)行われる何かをバックグラウンドで実行して、ユーザーに何らかの応答を与えるか、またはいくつかのコアで実行することにより、スピードアップできるタスクがあります。ただし、マルチスレッドが実際に有用な場合は、別の質問です。
状況1:何らかの処理が必要で、ヒット数/秒が少ないWebサーバー
ここでは、アイドルコアが使用され、スレッド化によりユーザーへの応答が速くなるため、マルチスレッド化(アルゴリズムに適用可能な場合)は良いことです。
状況2:何らかの処理を必要とし、1秒あたりのヒット数が多いWebサーバー
ここではマルチスレッドが可能ですが、コアは通常他のリクエストでビジーであるため、コアを適切に使用するためのリソースが残っていません。実際にタスクを複数のスレッドに分散すると、タスクが断片化され、すべての部分を完了する必要がありますが、スレッドでの実行順序は定義されていないため、応答時間に悪影響を及ぼすことさえあります。したがって、あるクライアントはすぐに応答を受信できますが、他のクライアントは最後のフラグメントが最終的に処理されるまでタイムアウトになるまで待機します。
状況3: Webサーバーは、非常に長い時間がかかる処理を実行する必要があります
ここではマルチスレッドが必要ですが、それを回避する方法はありません。クライアントは、応答を受信するまで数分またはおそらく数時間待つことができません。この場合、通常コールバックシステムが実装されているため、基本的に各タスクには現在の状態を照会できる「API」があります。ほとんどのオンラインショップは、この例です。何かを注文すると、後で注文ステータスを照会できます。
Apacheが標準構成で行うように、スレッド化の代替手段はプロセス分岐です。利点は、負荷がコア全体に分散することで(状況2にほとんど適用可能)、OSが自動的に処理するため、Webコード自体はこれらすべてのコアを使用するために何もする必要がありません。ただし、負荷が不均衡な場合、一部のコアがアイドル状態になり、リソースが最適な方法で使用されなくなります。正しく行われていれば、ほとんどの場合、スレッド化の状況がより良い解決策です。ただし、Apache/Tomcatの標準構成では、要求ごとに1つのスレッドが生成されるため、非常に古いスレッドモデルが使用されます。事実上、一定量のヒット/秒が与えられると、CPUは、これらの要求を実際に処理するよりもスレッドで忙しくなります。
これはいい質問です。Webアプリケーション開発に携わる開発者のほとんどは、明示的にマルチスレッドを使用していません。アプリケーションサーバーを使用してアプリケーションを展開しているため、アプリケーションサーバーは着信要求のスレッドプールを内部で管理しているため、理由は非常に明白です。
次に、なぜマルチスレッドを明示的に使用するのですか? Webアプリケーション開発者がマルチスレッドにさらされる必要があるのは何ですか?
多くのリクエストを同時にサーバーで処理する必要がある大規模なアプリケーションで作業する場合、特定の種類のリクエストが多くの処理を行ってアプリケーションのパフォーマンスを低下させる可能性があるため、あらゆる種類のリクエストを同時に処理することは困難です。
特定の種類の要求を処理した後、Webアプリケーションがユーザーに電子メールとSMSで通知する必要がある例を見てみましょう。要求スレッドと同期して実行すると、Webアプリケーションのパフォーマンスが低下する可能性があります。 つまり、マルチスレッドの役割がここにあります。このような場合、ネットワーク上で電子メールの送信とSMSのみを担当するスタンドアロンのマルチスレッドアプリケーションを開発することをお勧めします。
Webアプリケーションのマルチトレッドは、複数のアドレスからデータを取得するなど、パラレルアクションに関心がある場合に使用できます。
私が理解しているように、マルチスレッドは、複数のクライアントからの要求を処理するために使用できるスレッドプールとは異なる状況で使用されます。