4

我读到 WCF 服务限制在内部将请求排队,而无需任何额外的代码。是否可以监视这些内部队列以了解例如填充水平?

我的目标是避免客户端可以向服务发送许多请求(例如,通过缓慢或拥塞的服务),因此如果可以监控尚未发送的传出请求的数量,客户端可能会减少流量。

4

1 回答 1

1

您正在寻找的是一种节流算法。一种常见的此类算法是测量最后 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
}

您的延迟越高于阈值,限制就会越多。限制以二次方上升,因此可以保证收敛。

于 2012-06-28T13:55:34.433 回答