【发布时间】:2012-06-30 00:55:53
【问题描述】:
我读到 WCF 服务限制在内部将请求排入队列,无需任何额外代码。 是否可以监控这些内部队列以了解例如填充水平?
我的目标是避免客户端向服务发送许多请求(例如,通过缓慢或拥塞的服务),因此如果可以监控尚未发送的传出请求的数量,客户端可能会流量少。
【问题讨论】:
-
我刚刚阅读了您提供的链接...谢谢!但是,为了解释我的目标,我在问题中添加了一些细节。
我读到 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
}
您的延迟超过阈值越多,限制就越多。限制以二次方上升,因此可以保证收敛。
【讨论】: