Асинхронное взаимодействие

Базовый System Design
≈ 2 мин чтения

Работу можно передать и не ждать её завершения

При асинхронном взаимодействии отправитель передаёт сообщение или событие и продолжает работу, не требуя от получателя немедленного ответа в том же вызове.

Service A -> message broker -> Service B
    |
    +-> continues

Например, после создания заказа основной запрос может завершиться, а отправка письма, обновление аналитики и другие фоновые действия будут выполнены отдельно.

Сервисы меньше зависят друг от друга по времени

Получатель может временно работать медленнее или быть недоступен, а сообщения некоторое время останутся в промежуточном слое. Это помогает переживать кратковременные пики и не заставляет отправителя ждать каждую фоновую операцию.

Но результат становится не мгновенным. Между отправкой сообщения и фактическим изменением другой части системы появляется задержка, поэтому пользователю или следующему сервису иногда приходится работать с ещё не обновлённым состоянием.

Асинхронность требует явного контроля состояния

Если нужно узнать итог фоновой операции, его нельзя просто получить как return-значение текущего вызова. Приходится хранить статус, связывать сообщения идентификаторами или получать отдельное событие о завершении.

Кроме того, одно и то же сообщение может прийти повторно, а порядок обработки не всегда совпадает с порядком отправки. Дальше в разделе мы отдельно разберём паттерны доставки и способ безопасно относиться к повторам.

Асинхронность не делает работу бесплатной. Она переносит её во времени и разрывает ожидание между участниками, но добавляет состояние, очереди и более сложную диагностику.