WCF サービスのスロットリングは、追加のコードなしで要求を内部的にキューに入れることを読みました。これらの内部キューを監視して、たとえば、充填レベルを知ることはできますか?
私の目標は、クライアントがサービスに多くのリクエストを送信できないようにすることです (たとえば、低速または混雑したサービスを介して)。そのため、まだ送信されていない送信リクエストの量を監視できれば、クライアントのトラフィックが少なくなる可能性があります。
あなたが探しているのは、スロットルアルゴリズムです。このような一般的なアルゴリズムは、最後の N 操作の平均レイテンシを測定することです。遅延が異常なレベルを超えた場合は、明らかにサービスが飽和しているため、スロットルを開始します。
次のように実行できます。
while (true) {
var avgLatencyInSec = GetLatencyAverage();
var thresholdLatency = 0.1; //100ms default latency
var latencyDiff = Math.Max(0, avgLatencyInSec - thresholdLatency);
Thread.Sleep((latencyDiff / thresholdLatency) * (latencyDiff / thresholdLatency));
//you need to tune the sleep amount by a constant factor
}
レイテンシがしきい値を超えるほど、スロットリングが開始されます。スロットリングは 2 次的に上昇するため、収束が保証されます。