20

年間を通じて非常に多くのトラフィックが発生することが予想される Web サイト アプリケーションがあります。私たちは現在、忙しい時期にユーザーを「保留中」のページにリダイレクトするサードパーティ製の負荷分散ソフトウェアを使用しており、大量のリクエストが殺到してウェブ アプリケーション サーバーが窒息するのを防いでいます。

今後は、このプロセスをより細かく制御し、何らかの仮想キューを実装したいと考えています。現在のロード バランサーにはキューイング機能はなく、レート制限に基づいてトラフィックを通過させるだけです。これはランダムで、ページを更新したとき (または自動更新されたとき) に運がいいです。

これについてオンラインで読んだことがありますが、非常に基本的な仮想 HTTP 要求キューを実装する方法に関する実装の詳細はほとんど見つかりませんでした。もちろん、 queue-itNetpreceptなどの本格的なサービスとしてこれを提供している会社もありますが、これらは現在のニーズに対して過剰に思えます (そして非常に高価です)。

問題の Web アプリケーションは、ASP.Net MVC で記述されています。現時点では「キューの優先度」などの高度な機能は必要ないことを念頭に置いて、静的キュー マネージャー クラスなどを使用して非常に基本的な概念実証を作成しましたConcurrentQueue<T>が、これが有効でスケーラブルなアプローチですか? これは、メインのアプリケーション層の一部になり得るものですか? それとも別々に保管するべきですか?この種の機能を ASP.Net MVC アプリに実装する方法に関する技術的なノウハウを持っている人はいますか?


編集:これまでの回答に感謝します。答えのほとんどは、キャッシングについて非常に詳細に説明されているようです。これは、ASP.Net Web キャッシング、ロード バランサー レベルでのフル ページ リクエストのキャッシング、および AppFabric を使用したオブジェクト キャッシングを使用して、当社の Web サイトですでに (非常に) 頻繁に採用されています。

キューを管理できる理由は、プロセスが非常にデータベース書き込み負荷が高いためです。特定の製品の注文をウェブサイト経由で効果的に作成しています。これは、これらの DB トランザクションが直前の在庫チェックなどを考慮していることを意味します。これがパフォーマンスの問題が発生する場所であり、何らかのキューイング システムを実装したい理由です。

データベース サーバーにより多くのリソースを投入することは、現実的なオプションではありません。この性質のキューイングシステム(C#またはその他)の技術的な実装の詳細を本当に探しています。これが最初に明確にされていなかった場合は申し訳ありません。

4

7 に答える 7

2

アプリケーションのキューイングによっては、問題がまったく解決しない場合があります。キューを構築すると、同時に実行されるスレッドが少なくなるため、サーバーが同時に実行する作業が少なくなります。

いつキューに入れますか?

明らかに、私は質問を逆にする必要があります: なぜあなたは列に並んでいるのですか? おそらく、サーバーが着信トラフィックの量を処理できないためです。数秒しか続かないピークについて話している場合、これは大したことではありません。キューを構築し、数秒で処理します。

キューは単なるバケツです

あなたの質問が述べているように、このピークは「年間を通じて数ポイント」数秒より長く続きます。したがって、キューを処理するとクライアントでタイムアウトが発生するだけの十分な時間、サーバーが新しいリクエストの大量の流入を経験していると思います。[参考: ネットワーキングのバケット モデルを確認してください。これらには対処すべき同じ問題があります]

簡単な例を挙げましょう:

ある夏の日、街角で冷たいレモネードを差し出しているあなた。1 分あたり最大 5 人のクライアントを処理できます。昼食時のピークは、1 分あたり約 7 人のクライアントがレモネードを求めて列に並んでいることを意味します。1 分後に 2 人のクライアントが待機し、2 分後には 4 つのクライアントが注文の処理を待っています [など]。

ピーク時の流入が 10 分間続くと、キューは最大長の 20 クライアントに達します。

別の日は非常に暑く、突入のピークは通常の 1 分間に 7 クライアントではなく、1 分間に最大 42 クライアントに達します。これは、1 分後にすでに 37 人のクライアントがレモネードを待っていることを意味します。明らかに、それが地球上で最後のレモネードであることを除けば、クライアントはレモネードを飲むために 1 時間も列に並ぶことはなく、すぐに立ち去ります。

そして、これはサーバーのピークに関する同じ問題です。処理できるよりも多くの着信接続が継続的に発生している場合、キューがいっぱいになるまで大きくなり、着信クライアントをドロップします。したがって、キューイングで得られるのは、最初にドロップされたクライアントを遅らせて、他のクライアントを保留にすることだけです (これも面倒です)。

現実世界の例に戻ります。この問題はここでどのように解決できますか?静かに簡単です。各クライアントの処理を高速化するか、店員を何人か集めて、2 番目、3 番目、... のキューを開いて複数のクライアントを一度に処理し、すべての注文を処理します。現実世界やプログラミングと同様に、高速化はそれほど簡単ではありません。短期間だけ複数のインスタンスを起動することも、非常に困難です。しかし、明確に言えば、これらの問題を処理するための唯一の信頼できるソリューションです。

IIS と MVC の使用: 適切な場所で実際にキューに入れていない

[単一のキューでのキューイング] 同時アクティブ ワーカーの最大数に達した場合は、アプリケーションでキューを作成し、すべての突入リクエストを一時停止することができます。ただし、これは、IIS の観点から空き同時接続がある場合、IIS が新しい接続を受け入れるため、要求ごとに生成およびロードされるすべての突入 tcp 接続と asp セッションのオーバーヘッドがないことを意味するものではありません。

http プロキシ アプリケーションの構築

[1 つまたは複数のキューでのキューイング] カスタム プロキシ アプリケーションを構築している場合、新しい着信クライアント接続を受け入れるタイミングを自分で決めることができる場合があります (tcp リスナーを一時停止するか、ワークロードが十分になるまで新しいクライアントを受け入れないだけです)。新しいクライアントを処理するためのリソース)。もちろん、プロキシはリクエストを複数のホストに分散させ、ある種の負荷分散を行うことができますが、これには追加のホストが必要で、すぐに起動してリクエストを処理できます (これはロードバランサーがあなたに要求するものです: バックエンドを持っているワークロードを処理する可能性があります)。これは完全に低レベルのアプローチであるため、これ以上詳細に説明する必要はないと思います。

ワークロードの一部を削減するためのいくつかの単純な側面について: - 画像などの静的コンテンツを低コストの他のサーバー/サイトにオフロードします。これにより、ハードで動的な作業を行うプライマリ サーバーの負荷が軽減されます。- キャッシング: 同じ結果が得られることを 2 回行わないでください。高いワークロードでアプリケーションが遅くなる場所を確認し、可能な限り高速になるように最適化してください。- 非同期で作業する/長いランナーをスリープ状態にする: 外部リクエスト (データベース) がある場合は、スレッドができるだけ長く実行されるように非同期で実装してから、ホストのスケジューラに他の保留中の作業を処理する機会。スレッドをベンチマークし、重要なメソッドの包含時間の長さと、それらがどこで時間を費やしているかを確認します。

これがあなたの問題を解決するのに役立つことを願っています.

于 2013-07-17T19:39:39.113 に答える
0

ベンチマークの数値を取得して、現在のセットアップ (インフラストラクチャとアプリケーション) が処理できる負荷/トラフィックの種類 (同時ユーザー数など) を確認できます。

これは、Microsoft Team Foundation Service (クラウドでホストされ、オンプレミス、つまりインフラストラクチャでホストされる TF Server とは異なります) を使用して行うことができます。負荷/ストレス/パフォーマンス テストを使用します。

TFS サービスは、開発者が 5 人未満の開発チームには無料だと思います。それについて私を引用しないでください:-)

大まかな数値を取得し、アプリケーションが対応できる場合は、何もする必要はありません。それができない場合、いくつかの決定を下す必要がありますか? その後、80/20 シナリオになります。リソース (開発時間、賃金など) の 80% を費やして 20% のパフォーマンスを向上させる価値はありますか? それとも、20% のハードウェア コスト (CPU、RAM、別のサーバーなど) を投資して 80% のパフォーマンスを即座に向上させる方がよいでしょうか?

このサイトがあなたのビジネスや顧客にとって注目度が高く、収入を生み出しているか、立法上の目的がある場合は、ハードウェアへの投資がソフトウェア開発への投資よりも簡単であることに気付くかもしれません。こうすることで、単一障害点 (SPF) のない高可用性 (HA) のスケーラブルなアプリケーションを実現できます。

待ち行列に関する質問に実際に答えるわけではありませんが、考慮すべき別の視点にすぎません。

参考までに、Windows Server 2012 エンタープライズ エディションを実行する 2 つの VM (VMWare を実行) フロント エンド Web サーバーにアップグレードしたいと考えています。これらは、Microsoft NLB を使用してネットワーク負荷分散されます (別の負荷分散サーバーやサード パーティ ソフトウェアは必要ありません)。backedn SQL サーバー用のアクティブ/アクティブ クラスターを用意します。これにより、ダウンタイムなしでサーバー (アップグレード、パッチなど) を維持できます。追加の利点は、IIS 8.0 を使用すると、SNI を使用して SSL (HTTPS) トラフィック用に同じ IP の複数のドメイン (ホスト) を実行できることです (ただし、windows xp を実行している魚雷ユーザーはとにかく 2014 年 4 月にサポートされなくなります)。セッション管理と MAC 状態 (クロス サーバー ポストバックなど) を処理するために .net アプリケーションをアップグレードする必要がありますが、トレードする価値はあります。

于 2013-07-17T19:31:30.003 に答える