Короткий ответ
Синхронный вызов выбирают, когда вызывающей стороне нужен немедленный результат для продолжения обработки; асинхронное сообщение — когда результат можно получить с задержкой, отправитель не должен блокироваться на доступности получателя, или нужно уведомить несколько независимых подписчиков.
Как это работает подробнее
Синхронный вызов создаёт временную связанность — оба сервиса должны быть доступны одновременно; сообщение развязывает это, но отправитель не может немедленно узнать результат обработки.
Пример кода
Схема
Синхронно: Checkout Service -> (HTTP, нужен результат сразу) -> Inventory Service: "есть ли товар в наличии?"
Асинхронно: Order Service -> (событие "order.created") -> [Notification, Analytics, Loyalty]Что использовать на практике
- Практика. Критерии выбора: нужен ли результат прямо сейчас для ответа пользователю; сколько получателей должны знать о событии; насколько критична доступность получателя прямо в момент отправки.
Подводные камни
- Риск. Делать все интеграции синхронными «для простоты», создавая цепочку хрупких зависимостей; делать критичную для пользователя операцию полностью асинхронной без способа дождаться результата.