Какие преимущества и недостатки синхронного взаимодействия между микросервисами по HTTP и HTTPS
Что проверяют
Понимаете ли вы, во что превращается простой HTTP-вызов в распределённой системе, и знаете ли инструменты .NET против каскадных сбоев. Следом спросят про таймауты, ретраи, circuit breaker и про то, когда лучше перейти на очередь.
Как отвечать
Сразу разведите понятия: HTTPS это тот же HTTP поверх TLS, разница в шифровании и аутентификации, а не в модели взаимодействия. Внутри кластера TLS тоже нужен, часто взаимный (mTLS) через service mesh. Его цена в рукопожатии и CPU, её снижает переиспользование соединений.
Плюсы синхронного вызова:
- простота: запрос, ответ, код статуса, ошибку легко найти и трассировать;
- немедленный результат: подходит, когда ответ нужен прямо сейчас, например проверить остаток перед оформлением заказа;
- зрелые инструменты:
HttpClient, ASP.NET Core, OpenAPI, а для внутренних вызовов gRPC поверх HTTP/2 с контрактом в.proto.
Минусы:
- временная связанность: лежит сервис B, значит сервис A тоже не выполнит запрос;
- сложение задержек: в цепочке из пяти вызовов задержки суммируются, а доступность перемножается: пять сервисов по 99,9% дают около 99,5%;
- каскадные сбои: медленный сервис держит соединения и потоки у всех вызывающих, пул исчерпывается, падают соседи.
Как это смягчают в .NET: IHttpClientFactory вместо new HttpClient() на каждый запрос, чтобы не исчерпать сокеты и учитывать смену DNS; таймаут на каждый вызов; ретраи с экспоненциальной задержкой только для идемпотентных операций; circuit breaker. Это даёт Polly, а с .NET 8 пакет Microsoft.Extensions.Http.Resilience с готовым AddStandardResilienceHandler(). CancellationToken передаётся по всей цепочке.
Где спотыкаются
Сравнивают HTTP и HTTPS как два способа взаимодействия. Вопрос про синхронность, а TLS это слой безопасности.
Предлагают ретраи без таймаутов и без лимита. При перегрузке они умножают трафик и добивают упавший сервис.
Не называют альтернативу. Если ответ не нужен сразу, событие через брокер снимает временную связанность, а синхронный вызов оставляют там, где результат нужен здесь и сейчас.