Синхронное взаимодействие
Вызывающий сервис ждёт ответ
При синхронном взаимодействии сервис A отправляет запрос сервису B и не может завершить текущую операцию, пока не получит ответ или ошибку. Такая модель естественна, когда результат нужен прямо сейчас.
Client -> Service A -> Service B
waits... |
<-----------+Например, сервис оформления заказа может запросить у сервиса цен актуальную стоимость товара, если без неё невозможно сформировать ответ пользователю.
Преимущество — простой поток выполнения
Код легко читать: отправили запрос, получили ответ, продолжили вычисление. Ошибку можно сразу связать с текущей пользовательской операцией, а клиент получает результат в рамках одного запроса.
HttpRequest request = HttpRequest.newBuilder(priceUri)
.timeout(Duration.ofSeconds(2))
.GET()
.build();
HttpResponse<String> response = httpClient.send(
request,
HttpResponse.BodyHandlers.ofString()
);Цена — зависимость по времени
Пока B отвечает медленно, A тоже удерживает свой запрос дольше. Если A последовательно вызывает несколько сервисов, задержки складываются, а недоступность одного участника может сорвать всю цепочку.
Поэтому у синхронных вызовов должны быть ограниченные таймауты и понятное поведение при ошибке. Бесконечно ждать удалённый сервис нельзя: зависший вызов постепенно съедает ресурсы вызывающей стороны.
Проверь себя
Когда Service A синхронно вызывает Service B, что происходит с текущей операцией A?