2016-04-12 5 views
1

私は1日あたり約200万リクエストを得ることができるaspコアWebサービスを持っています。私はAzureでこのWebサービスを実行します。これはちょうどxmlのリクエストレスポンスです。時にはビジネス時間に大きな負荷がかかります。しかし、私は5秒で応答を送信することを確認する必要があります。1つのリクエストに時間制限がある場合、IISでリクエストを進める方法

ミドルウェア(ハンドラ)で計算が終了していない場合は空白の応答を送るロジックを作成します。そしてすべては大丈夫です。しかし、アプリケーションプール内にキューがあり、すべての要求がQueue.Howでいくつかの時間を生き延びることができるという要求timelife cozをチェックすることができないという問題があります。待ち行列で?

ありがとう

答えて

1

キューが常に空になるようにアプリケーションを設計する必要があります。アプリケーションが少なくともリクエストに対する処理を直ちに開始できることを確認してください。各リクエストの開始時にタイムアウトロジックを開始し、タイムアウトが発生するとリクエストを強制終了することができます。

これを行うと、IIS/ASP.NETキューが再生されません。

非常に軽い処理しか必要ないため、タイムアウトロジックを実行するのはパフォーマンス上の問題ではありません。

おそらく、あまりにも多くのスレッドをブロックしないように、非同期IOと非同期待機を使用する必要があります。

あなたのコードは次のようになります。あなたはそれを行うためにSemaphoreSlimを使用することができ、同時ミドルウェアの呼び出しの数を制限したい場合は

var middlewareTask = ...; 
var timeoutTask = Task.Delay(5 seconds); 
if (await Task.WhenAny(middlewareTask, timeoutTask) == timeoutTask) { 
CancelRequest(); 
SendEmptyResponse(); 
} 

。非同期待機もサポートしています。

+0

iisから直接emtpyレスポンスを返すことは可能ですか? – Garik

+0

いいえ、そのようなサポートは組み込まれていません。私の答えの要点は、それが必要ではないということです。この回答はあなたを助けますか? – usr

関連する問題