Ответ
Синхронное взаимодействие — это модель связи между микросервисами, при которой сервис-инициатор (клиент) отправляет запрос и блокирует выполнение, ожидая немедленного ответа от сервиса-получателя.
Основные протоколы:
- HTTP/REST (наиболее распространен).
- gRPC (высокопроизводительный, на основе HTTP/2).
- GraphQL.
Пример вызова через REST API:
// Сервис A (клиент) синхронно вызывает Сервис B
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://service-b:8080/api/orders/123"))
.GET()
.build();
// Поток выполнения блокируется здесь до получения ответа
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// Дальнейшая обработка ответа
System.out.println("Статус заказа: " + response.body());
Преимущества:
- Простота: Прямая, интуитивно понятная модель, похожая на локальный вызов функции.
- Своевременность: Клиент сразу получает результат или ошибку.
Недостатки:
- Связность: Вызывает временную жесткую связь (temporal coupling) — сервис-получатель должен быть доступен в момент запроса.
- Каскадные сбои: Недоступность или медленная работа одного сервиса может "просадить" всю цепочку вызовов.
- Ресурсы: Заблокированные потоки/соединения ожидают ответа, что может исчерпать ресурсы при высокой нагрузке.
Применение: Идеально для операций, требующих немедленного подтверждения (проверка наличия, авторизация, простые запросы данных).