Мониторинг внутренних очередей WCF (во избежание отправки слишком большого количества запросов в службу)

Я читал, что регулирование службы WCF ставит запросы в очередь внутри без какого-либо дополнительного кода. Можно ли отслеживать эти внутренние очереди, чтобы знать, например, уровень их заполнения?

Моя цель состоит в том, чтобы избежать того, что клиент может отправлять много запросов к службе (например, через медленную или перегруженную службу), поэтому, если бы можно было отслеживать количество исходящих запросов, которые еще не были отправлены, клиент мог бы уменьшить трафик.


person enzom83    schedule 28.06.2012    source источник
comment
Не похоже, что это возможно - social.msdn.microsoft.com/Forums/en/wcf/thread/   -  person Eamonn McEvoy    schedule 28.06.2012
comment
Я только что прочитал предоставленную вами ссылку... Спасибо! Однако я добавил некоторые детали к вопросу, чтобы объяснить свою цель.   -  person enzom83    schedule 28.06.2012


Ответы (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
}

Чем больше ваша задержка превышает пороговое значение, тем больше будет происходить регулирование. Регулирование увеличивается квадратично, поэтому оно гарантированно сходится.

person usr    schedule 28.06.2012
comment
Чтобы вычислить этот фактор, должен ли я выполнить некоторые тесты, пробуя разные значения (затем выбрать фактор, который кажется достаточным временным интервалом, чтобы ограничить отправку запросов)? - person enzom83; 28.06.2012
comment
Да, попробуйте. Этот алгоритм нуждается в небольшой настройке. Квадратичное увеличение дросселирования гарантирует, что вам не нужно делать это идеально правильно. Он будет самонастраиваться в определенной степени. - person usr; 28.06.2012