У меня есть вопрос о том, как правильно обрабатывать циклическую балансировку DNS в c # с помощью HttpClient.
Допустим, у вас есть API (API 1), который по запросу потенциально вызывает другой API (API 2). Таким образом, вы можете иметь несколько одновременных запросов в API 1, вызывая API 2 несколько раз. Каков наилучший способ включения циклического перебора DNS?
В нашем случае у нас есть API в кластерах Kubernetes с несколькими репликами для API 1 и 2. Мы используем Consul Side Car Inject для определения местоположения службы (https://www.consul.io/docs/platform/k8s/connect.html)
Когда мы используем HttpClientFactory для разрешения HttpClient следующим образом.
private async Task<string> MakeSomeRequest(string endpoint)
{
// IHttpClientFactory _clientFactory is injected in the constructor
var httpClient = _clientFactory.CreateClient();
httpClient.BaseAddress = baseAddress;
var result = await httpClient.GetAsync(endpoint);
return await result.Content.ReadAsStringAsync();
}
Мы сталкиваемся с проблемой, что циклическое распределение нагрузки DNS не используется, поскольку сокет остается открытым, а соединение HttpClientявляется общим для всех запросов. Таким образом, API 1 получает первое соединение с первым экземпляром API 2 и продолжает использовать одно и то же для всех потоков API 1.
В настоящее время мы отказались от использования httpClientFactory. в пользу ол верных. Что работает, потому что не сохраняет сокет открытым.
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = baseAddress;
result = await httpClient.PostAsJsonAsync(endpoint, payload);
return await result.Content.ReadAsStringAsync();
}
Я рассмотрел несколько именованных регистраций HttpClientFactory, а затем случайно выбрал одну, но мне любопытно узнать, есть лилучше?