2013-12-10 15 views
31

私は、Webアプリケーションの開発に2年以来、java(サーブレット、JSP)を使用しています。この2年間で私はどんなプロジェクトでもmultithreading(明示的に - サーブレットコンテナが異なるサーブレットに同じサーブレットを提供するためにスレッドを使用することを知っているので)を使う必要はありませんでした。ウェブアプリケーションでのマルチスレッドの役割

私はWeb Developerのポジション(java)のインタビューに出席するたびに、javaのスレッドに関するいくつかの質問があります。私はJavaスレッドの基礎を知っているので、質問に答えることは問題ではありません。しかし、時には私は何かが欠けているかどうか混乱スレッドを使用しないでWebアプリケーションを開発している間混乱する?

私の質問は、Webアプリケーションでmultithreadingの役割は何ですか? multithreadingがウェブアプリケーションで使用できる任意の例が認められるであろう。

ありがとうございます。

+2

IMHO、あなたは、Webアプリケーションでのマルチスレッドの主な役割は、複数の独立した要求を同時に処理して、サーバを応答させることです。 – Ingo

+4

例として、ユーザー登録ページがあり、そのユーザーに登録に関する電子メール通知を送信する必要があります。この場合、別のスレッドで電子メールを送信してマルチスレッドを使用できます。 – Foolish

+1

xmlを解析するためにマルチスレッドを使用しています –

答えて

40

マルチスレッドは、主に非同期呼び出しに興味がある場合にWebアプリケーションで使用できます。

たとえば、GSMネットワーク上でユーザーの状態をアクティブにする(たとえば、4Gプランをアクティブにする)Webアプリケーションがあり、最後に確認用のSMSまたは電子メールメッセージを送信するとします。

特にGSMネットワークに負荷がかかっている場合、Web呼び出しに数分かかることがわかっているため、Webスレッドから直接呼び出すのは意味がありません。

基本的に、ユーザーが「アクティブ化」をクリックすると、サーバーは「4Gプランを有効にしていただきありがとうございます。プランは数分で有効になり、確認SMS /メールを受信します。

この場合、サーバーは新しいスレッドを生成する必要があります。理想的にはスレッドプールを非同期で使用し、ユーザーに即座に応答を返します。

ワークフロー:

1-ユーザー
2-サーブレットは、要求を受信し、スレッドプールに新しい「アクティブ4G計画」タスクを起動させる「活性化」ボタンをクリックします。
3サーブレットは、タスクが終了するのを待たずに、HTML応答をすぐにユーザーに返します。
4- HTTPトランザクションの終了
。 。 。

非同期で、4Gの計画は、後にアクティブになると、ユーザーはSMSまたは電子メールを介して通知され、等...

5

実際の例についていえば、マルチスレッドを使用するには、いくつかの理由が、そこにあると私それについて知らないウェブ開発者を雇うことはありません。しかし、結局、マルチスレッドを使用する理由は標準開発とWeb開発で同じです。つまり、バックグラウンドでしばらく時間がかかります(ブロックとも呼ばれます)。いくつかのコアで動作させることによってスピードアップできるタスクがあります。実際にマルチスレッドが有用な場合は、別の質問です。

状況1:アイドル状態のコアを利用し、スレッドされているよういくつかの処理を必要とし、低ヒットを持つWebサーバ/秒

ここで(アルゴリズムに該当する場合)マルチスレッドは、良いことですユーザへのより迅速な応答をもたらすことができる。

状況2:いくつかの処理を必要とし、高いヒットを持つWebサーバ/秒

ここではマルチスレッドは可能ですが、コアが、通常は他の要求と忙しいように残されたリソースはありません適切に使用してください。実際の作業は現在、断片化され、すべての部分が完了する必要がありますが、スレッドと実行の順序が定義されていないようにも、応答時間に悪影響を与える可能性がありますいくつかのスレッドにタスクを分散。したがって、あるクライアントはすぐに応答を受け取ることができますが、他のクライアントは最後のフラグメントが最終的に処理されるまでタイムアウトになることがあります。

状況3: Webサーバーが

ここでマルチスレッドが必要とされる非常に長い時間がかかり、いくつかの処理を行う必要があり、その周りに方法はありません。クライアントは応答を受信するまで数分または数時間待つことができません。この場合、通常はコールバックシステムが実装されているため、基本的に各タスクには現在の状態を照会できる「API」があります。ほとんどのオンラインショップはこれの一例です。何かを注文した後、注文ステータスを照会することができます。

スレッドの代わりにプロセスフォークがあります。これは、Apacheが標準的な構成で行うように行われます。利点は、その負荷は(状況2に主に適用される)のコアに分散しているされており、ウェブ・コード自体が自動的にOSハンドルとして、これらすべてのコアを使用するように何もする必要はありません。しかし、不均衡な負荷があると、一部のコアがアイドル状態になることがあり、リソースが最適な方法で使用されません。スレッディングの状況は、正しく実行された場合、ほとんどの場合、より良い解決策になります。しかし、Apache/Tomcatの標準設定では、リクエストごとに1つのスレッドを生成することによって、非常に時代遅れのスレッドモデルを使用しています。効果的に一定量のヒット/秒が与えられた場合、CPUは実際にそれらの要求を処理するよりスレッド化に忙しいです。

+0

状況3はJMS、メッセージキューなどのユースケースですか?このマルチスレッドまたはメッセージキューには何を使用しますか? – onlinenaman

+0

通常は両方の組み合わせ。マルチスレッド化では、利用可能なすべてのリソースとメッセージキューなどの技術を利用して、100%効率で使用されるようにします。 – TwoThe

3

これは良い質問です。ウェブアプリケーション開発で作業する開発者のほとんどは、マルチスレッドを明示的に使用していないと思います。 アプリケーションをデプロイするためのアプリケーション・サーバーを使用しているので、理由は非常に明白である、アプリケーションサーバは、内部着信要求のためのスレッドプールを管理します。

なぜ明示的にマルチスレッドでしょうか? Webアプリケーション開発者が自分自身をマルチスレッドにさらす必要があるのは何ですか?

多数の要求を同時にサーバーする必要がある大規模なアプリケーションで作業する場合、特定の種類の要求が処理を多くしてアプリケーションのパフォーマンスを低下させる可能性があるため、あらゆる種類の要求を同時に処理することは難しい。

特定の種類の要求を処理した後のWebアプリケーションで、電子メールとSMSを介してユーザーに通知する必要がある例を挙げてください。リクエストスレッドと同期させると、Webアプリケーションのパフォーマンスが低下する可能性があります。 ここでは、mutlithreadingの役割があります。このような場合には それだけで、電子メールやSMSを送信するための責任があるネットワーク上のスタンドアロンマルチスレッド・アプリケーションを開発することをお勧めします。

0

複数のアドレスからデータを取得するなど、パラレルアクションに興味がある場合は、Webアプリケーションのマルチスレッド化を使用できます。

私が理解しているように、マルチスレッドは、複数のクライアントからの要求を処理するために使用できるスレッドプールとは異なる状況で使用されます。

関連する問題