2017-06-15 18 views
0

コントローラへのリクエストに処理時間がかかるアプリケーションがあります。コントローラは要求ごとにスレッドを開始し、最終的にはいくつかのデータをデータベースに返します。処理できるリクエストの数を制限する必要があります。したがって、制限が100であるとしましょう。コントローラーがすでに100個の要求を処理している場合、少なくとも1つの要求が完了するまで101番目の要求は503の状態を返します。.netcore APIコントローラへのリクエスト数を制限します。

現在のプロセス数を維持するためにアプリケーション全体の静的カウンタを使用できますが、これを行うにはより良い方法がありますか?

EDIT:

コントローラが応答する時間がかかるコントローラは、静止データのいくつかのTBに及ぶ大規模なデータベースであり、別のAPIを呼び出しているためである理由。私が理論的にこれを最適化することができたとしても、それは私が制御できるものではありません。さらに悪いことに、サードパーティ製のAPIは、同時に10以上のリクエストがあると、タイムアウトします。私はすでに着信要求をサービスバスキューにドロップしています。私はちょうどいい数の要求が来ると、それが設定された数の要求を超えたときに返す503のグローバルなカウントを保持するために、私のAPIコントローラで良い方法が必要です。

+0

多分、処理に時間がかからないようにプロセスを作る方法を考えていますか?そういうわけで、まず最初にこのような "ハック"は必要ありません。 – jpgrassi

+0

** ASP.NET(Core)アプリケーション内でスレッド**を生成しないでください!あなたはスレッド管理を使いこなす。要求がCPUを大量に使用する場合は、**要求スレッド**で実行します。 I/O集約型(ネットワーク、データベース、ファイルシステム)の場合は、async/awaitを使用します。他のすべてのもの(長時間実行されているCPUベースのタスク)では、バックグラウンドワーカー(別個のアプリケーションとして)とメッセージバスを使用して – Tseng

答えて

0

APIコントローラへのリクエストを制限しないでください。 (データベース、キューなど)を完了する必要があるプロセスのリストを格納することが考えられます(データベース、キューなど)

この作業を処理するWebリクエスト以外のものを作成します。ここで一度に処理される数を管理できます

処理が完了したら、SignalRを介してページに戻って処理して表示する必要があるデータを取得したり、ステータスを表示したりすることができます(Windowsサービス/ワーカーロール/ Hangfireなどを使用) 。

この利点は、プロセス全体を再実行することなく、いつでもページに戻ったり、更新してステータスを取得できることです。

関連する問題