С HttpClient, для запросов на тайм-аут, почему длительность зависимостей, зарегистрированная в приложениях, намного меньше, чем установленное время ожидания? - PullRequest
0 голосов
/ 18 марта 2020

Я использую IHttpClientFactory для создания HttpClients в моих классах с тайм-аутом, равным 20 сек для моего клиента. Я просматривал журналы зависимостей в обзорах приложений и обнаружил, что были запросы с тайм-аутом, но длительность зависимости была намного меньше установленного тайм-аута 20 сек. См. Изображение ниже для этих данных.

SetTimeout vs продолжительность зависимости для истекших запросов на зависимость

Итак, я предполагаю, что в Экземпляр HttpClient, где запросы ждут своей очереди и затем фактически обрабатываются. Это объясняет, почему продолжительность зависимости составляет около 2 секунд, но время ожидания запроса все еще истекло (время ожидания составляет 20 секунд). Эти запросы находились в очереди около 18 секунд, прежде чем их отправили.

В файле startup.cs я настраиваю HttpClientFactory следующим образом:

services.AddHttpClient("LongTimeoutClient", c => { c.Timeout = TimeSpan.FromMilliseconds(22000); })
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { UseCookies = false})
.SetHandlerLifetime(TimeSpan.FromMinutes(5));

В моем классе я использую httpClient as:

httpClient = httpClientFactory.CreateClient("LongTimeoutClient");

Кроме того, для 7 экземпляров приложения процентили длительности зависимости были (см. здесь Проценты продолжительности зависимости с 7 экземплярами приложения )

Когда, Я увеличил экземпляр до 9, процентили длительности зависимости резко уменьшились (см. Здесь процентили длительности зависимости с 9 экземплярами приложения )

Кроме того, после увеличения экземпляра приложения мы смогли обработать 22k запросов в час. Раньше это было 14К. Увеличение пропускной способности не пропорционально увеличению в экземплярах.

Почему продолжительность зависимости уменьшается после увеличения числа экземпляров приложения? Имеет ли это какое-то отношение к отсутствию соединений, которые экземпляр может устанавливать с конечным сервером за раз, что также может быть причиной этой очереди в HttpClient? Зачем хотя бы производительность на 60% (от 14k до 22k), когда экземпляры увеличились только примерно на 30% (от 7 до 9)

Пытаясь понять все вышеперечисленное, как я могу решить проблему с этими тайм-аутами, когда продолжительность зависимости намного меньше, чем фактическое время ожидания, установленное на httpclient? Есть ли способ установить минимальное количество httpclients в пуле фабрики клиентов? Или любые другие предложения, которые могут помочь? Заранее спасибо

...