0

ASP.NET Web アプリケーションには固定数のワーカー スレッドと I/O スレッドが付与され<processModel>、web.config ファイルの設定によって管理されるため、多くのユーザーがいる大規模な Web サイトでは、エラーのログ記録や電子メールの送信などのタスクを実行するために、新しいワーカー スレッドをスピンしたり、.NET ThreadPool からスレッドを使用したりすることに特に利点はありません。

言い換えれば、私の Web アプリケーションで、着信するすべての要求に対して、要求ハンドラーが 3 つのタスク (タスク A、タスク B、タスク C の順) を連続して実行し、結果を返すとします。 HTML ページ。

ただし、3 つのタスクのうち、タスク B は、結果の HTML には何の関係もありません。これは、ログ ファイルにテキストを記録するなどのタスクである可能性があります。

次に、タスク B を別のワーカー スレッドに移動するとCurrentThread、ワーカー スレッドの ASP.NET プールからのワーカー スレッドでもある がより速く返され、アプリケーションのユーザーの応答時間が短縮されます。タスク B はワーカー スレッドの同じ ASP.NET プールから新しいワーカー スレッドを割り当てる必要があるため、アプリケーションがサービスを提供できる同時ユーザーは影響を受けます。

したがって、Web アプリケーションのシナリオでは、新しいスレッドの分岐はパフォーマンスにプラスの影響を与えますが、スケーラビリティにはマイナスの影響を与えるという私の理解は正しいですか。したがって、多くのハードウェアを購入してスケールアウトする余裕がある場合にのみ、マルチスレッドのサーバー側コードを作成する必要がありますか?

そうでない場合は、一方を他方と交換するだけですか?

4

1 に答える 1

1

あなたの質問の核心は次のように思われます:「他のスレッドを使用して二次的な問題を非同期に処理すると、垂直方向のパフォーマンスをスケーリングする能力が妨げられますか?つまり、各 Web サーバーが一度に処理できる接続の数

一般に、アクティブに処理されているリクエストは、スレッドの数より多いことはありません。仮想 CPU コア (論理プロセッサ) ごとに .Net スレッド プールに 100 個のスレッドが割り当てられます。次の呼び出しThreadPool.GetAvailableThreads Methodを使用して、マシンでこれをテストできます。

私の経験では、簡単な答えは「はい」ですが、これは、Web サーバーの CPU がアプリケーションのトラフィック負荷のボトルネックである場合にのみ当てはまります。そのため、Web サーバーがデータベースで待機している場合、または API 呼び出しが返されるのを待機している場合は、CPU を使い果たす前に他のリソースを使い切ってしまう可能性があります。

独立した処理タスクの処理をスケーリングしようとするときに推奨される解決策は、Microsoft Message QueueRabbitMQなどのキューを使用することです。次に、Web サーバーのリソースを最大限に活用しながら、これらの要求に依存しないタスクを完了するために必要な数のスレッドを「サービス」マシンに個別に割り当てることができます。

オフライン処理にキューを使用すると、スケーリングも簡単です。小規模の場合は、これらのサービスをすべて同じボックスで実行できますが、より多くの処理能力が必要になると、そのサービスを別のマシンまたは必要な数のマシンに移動できます。

このリンクされた質問と回答は多少似ています。

于 2013-04-17T21:36:41.483 に答える