Включен стандартный сброс TCP балансировщика нагрузки вместе с узлами кластера service fabri c - PullRequest
0 голосов
/ 18 июня 2020

У меня есть две службы (в виде веб-API), запущенные в кластере из 5 сервисов c, например ServA и ServB. ServA вызывает API ServB. Поскольку оба находятся в одном кластере Service fabri c, мы используем службу имен DNS и внутренний балансировщик нагрузки.

В ServB API у нас есть конечные точки, на которые потребуется более 30 минут Времени, но меньше 60 мин. Поскольку эти службы находятся за балансировщиком нагрузки, а время простоя в балансировщике нагрузки составляет 30 минут. Мы перешли на использование балансировщика нагрузки стандартного типа, который даст возможность сбросить TCP через 30 минут простоя. Увеличен тайм-аут простоя до 30 минут и включен сброс TCP в правиле балансировки нагрузки.

Из настроенных нами Application Insights я могу подтвердить, что ServB / ServBUrl отвечает через 30 минут, но я не могу удержать / поймать ответ в ServA.

поэтому добавил Код в ServA следующим образом:

Ссылка: Standard Load Balancer [https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-reset]

// The Servicepoint code has been added after changing to Standard load balancer
// Refernce: https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-idle-timeout#tcp-idle-timeout
// https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepoint.settcpkeepalive?redirectedfrom=MSDN&view=netcore-3.1#System_Net_ServicePoint_SetTcpKeepAlive_System_Boolean_System_Int32_System_Int32_

// servBUrl is a DNS named url, ex: https://servdnsname.domain.net/servicealias/api/<RequestRoute>
var servicePoint = ServicePointManager.FindServicePoint(new Uri(servBUrl));

servicePoint.ConnectionLeaseTimeout = 60 * 60 * 1000;
servicePoint.MaxIdleTime = 60 * 60 * 1000;                    
servicePoint.SetTcpKeepAlive(true, 60 * 60 * 1000, 1000);

HttpRequestMessage request = new HttpRequestMessage(httpVerb, servBUrl);
HttpResponseMessage httpResponse = await HttpClientInstance.SendAsync(request);

Дополнительная информация:

  1. Я использую один объект HttpClient для выполнения вызовов и назначаю тайм-аут HttpClient с помощью InfiniteTimeSpan
HttpClientInstance.Timeout = System.Threading.Timeout.InfiniteTimeSpan;

Мой LoadBalancer использует одно правило балансировки нагрузки с портом 443, и мой ServB также работает на порте 443.

Я знаю, что запуск REST API более 30 минут - это странно , но это неизбежно.

Итак, ниже мои вопросы / пояснения,

  1. Действительно ли мой код ServicePoint обрабатывает сброс TCP, когда мой балансировщик нагрузки отправляет сброс TCP?

  2. Если балансировщик нагрузки отправляет сброс TCP, достигает ли он тот же узел или другой узел, как подтвердить?

  3. Как я могу заставить свой HTTP-вызов ServA ждать ответа ServB с внутренней конфигурацией балансировщика нагрузки.

...