1

作業項目が送信され、ワー​​クロードに応じてユーザーに割り当てられる Web アプリケーション (asp.net) があります。

ユーザーのワークロードは、現在ユーザーに割り当てられているアイテムの数 (およびその他の要因) に基づくアルゴリズムを使用して計算されます。新しいアイテムはそれぞれ、現在のワークロードが最も低いユーザーに割り当てられ、ワークロードが増加します。項目を完了すると、ユーザーの作業負荷が減少します。アイテムは同時に提出、割り当て、完了されるため、ワークロード レベルは絶えず変化します。作業項目は SQL データベースに格納されます。

ユーザーベース全体のワークロードの最新の状況を使用して、すべての割り当ての決定が行われるようにする方法が必要です。

私の考えは、キャッシュ内のワークロード情報の読み取り/書き込み同期ストアを提供することです。

これは最善のアプローチですか?または、データベースを使用してロックを制御する必要がありますか? アプリケーションのボトルネックを回避するにはどうすればよいですか?

アドバイスをいただければ幸いです。

4

3 に答える 3

1

これは多くの要因に依存しますが、キャッシュを参照するとき、Asp.Netによって提供される標準キャッシュを意味しますか?

常に最新の情報を入手することが絶対に重要ですか、それとも2つのリクエストが割り当てられた場合、リクエストが行われた時点で最もビジーでない2人のユーザーに割り当てられても問題ありませんか?

実際にキャッシュを使用してこの情報を保存できますが、これは通常、1台のサーバーのみを使用することを前提としています。高負荷の場合、クラスタリングまたは負荷分散を使用する可能性がありますか?

私があなたに与えることができる最善のアドバイスは、各ユーザーとキューの負荷を表す豊富なドメインモデルと、疎結合のデータアクセス、および多くの自動化されたユニットとシステムのテストを備えた、適切に設計されたアプリケーションを構築することです。このようにして、動作するアプリケーションを構築し、最適化についてあまり心配することなくシステムを迅速に稼働させ、パフォーマンステスト/プロファイリングをできるだけ早く開始できます。

パフォーマンスの問題が発生した場合は、プロファイリング\トレースによってボトルネックを特定し、必要に応じて最適化を追加できます。これには、キャッシュまたは最適化されたクエリ\ビューまたはそれらの組み合わせが含まれる場合があります。

ボトルネックがどこにあるかを2番目に推測して削除しようとすると、推測が間違ってシステムの設計が損なわれる可能性があります。適切に設計されたシステムは、必要なときに最適化できます。

私が最初にこれを想定する方法は、これとドメインモデル(キャッシング、遅延読み込み、IDマッピングを使用して必要に応じて効率を提供します)。ドメインモデルは、主にワークロードの表現を保持します。

これには、ユーザー、作業項目、作業キュー、および割り当て戦略クラスがあると思います。これらの多くは、メモリに保持することも、リクエスト間でローカルに保存することもできます。各リクエストは、モデルを更新するイベントで表すことができます。

たとえば
、ユーザーが作業項目を完了すると、
サイトがドメインイベントを発生させて、ドメインモデルに変更を通知します。
ドメインモデルはイベントを受信し、ユーザーの作業負荷を更新します。

その場合、作業の割り当ては、ドメインモデルに、必要に応じて作業を割り当てるように依頼することです(これは、割り当てが最も少ないユーザーを見つける戦略を介して行われます)。これは、個々の作業要求や、次に作業を要求したときにユーザーに通知するために発生したイベント以外のバックグラウンドで発生する可能性があります。

于 2008-10-14T21:06:54.790 に答える
1

これを制御するには、データベースを使用してください。

何らかの理由で、将来、Webファームを利用するために拡張する必要がある場合は、問題は発生しません。ただし、データをキャッシュしてローカルで作業している場合は、興味深いことが起こります。

また、Webガーデン設定を利用して、サーバーにかかる負荷の管理に役立てることができます。これは、キャッシュされた状況では正確には不可能です。

第二に、これはおそらく完璧である必要はないことを理解してください。(コールセンターでリードを配布するなど)大量の作業が発生する場合は、高速である限り、本当に近づくことが重要です。

于 2008-10-14T21:25:55.233 に答える
0

ユーザーがよりリアルタイムのアプローチを必要とするほど迅速に作業を完了する可能性は非常に低いため、データベースを使用してこれを制御します。

したがって、作業項目に関連する一連のテーブルがあり、クエリを実行して現在の作業レベルを計算し、特定の作業項目を受け取る次の人を決定できます。

次に、一連のストアドプロシージャを使用して、作業項目を完了としてマークしたり、作業項目を誰かに割り当てたりすることができます。

ボトルネックを最小限に抑えるには、データベースが適切に正規化され、ストアドプロシージャが多くのテーブルを使用しないようにします。これにより、適切に増加するはずです。

これを確認するために、いくつかのテストハーネスを作成して、作業項目の割り当てを確認できます。パフォーマンスは、高い使用率で必要なものです。

于 2008-10-14T21:05:41.827 に答える