Мы используем System.Net.Http.HttpClient
для вызовов между микросервисами внутри k8s.
- ОС Linux (внутри докера)
- dotnet TargetFramework: netcoreapp2.1
- сервер:Протокол Kestrel
- : http
Несколько дней назад мы заметили очень странное поведение вызовов http: некоторые вызовы между микросервисами (около 2-3%) завершались с ошибкой
System.OperationCanceledException: The operation was canceled.
at System.Net.Http.HttpClient.HandleFinishSendAsyncError(Exception e, CancellationTokenSource cts)
at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
at OurCode.HttpServiceClient.GetStringResponseAsync(String methodUri, HttpMethod httpMethod)
...another our code...
после нашего тайм-аута для http-звонков (это 3 секунды).Но не было журналов о вызове внутри службы вызываемого абонента.
Мы включили пакетный ритм для отслеживания http-запросов, а также заметили, что никакие http-запросы от службы вызывающего абонента к службе вызываемого абонента не выполнялись.Процессор, память и сеть для этих служб были в порядке все время.
Упрощенная версия нашего кода для вызовов http выглядит следующим образом:
public async Task<string> GetStringResponseAsync(String methodUri, HttpMethod httpMethod)
{
int timeoutInMilliseconds = 3000;
var tokenSource = new CancellationTokenSource();
var rm = new HttpRequestMessage(httpMethod, methodUri);
Task<HttpResponseMessage> httpTask = HttpClient.SendAsync(rm, tokenSource.Token);
tokenSource.CancelAfter(timeoutInMilliseconds);
HttpResponseMessage response = await httpTask;
await EnsureSuccessStatusCode(response);
return await response.Content.ReadAsStringAsync();
}
Любые идеи о том, какая проблема может вызвать это странное поведениебез http запроса через сеть, и что я могу сделать для дальнейшего исследования?