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

Иногда нужно дождаться ответа, а иногда — отправить задачу и не блокироваться.

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

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

Классический HTTP-запрос: сервис A зовёт сервис B и блокируется, пока B не ответит. Просто и понятно, результат сразу. Но есть цена: A зависит от скорости и доступности B. Если B тормозит — тормозит и A. Если B упал — упал и запрос A. Связность тесная.

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

Сервис A кладёт сообщение в очередь и сразу отвечает пользователю «принято». Сервис B заберёт задачу из очереди и обработает её позже. A не ждёт B и не зависит от его доступности в момент запроса. Классика: загрузил видео → «обрабатываем» → конвертация идёт в фоне.

Синхронно:   A ──запрос──▶ B
             A ◀─ответ─── B   (A всё это время ждёт)

Асинхронно:  A ──задача──▶ [ очередь ] ──▶ B (обработает позже)
             A продолжает работу немедленно

Сравнение

КритерийСинхронноеАсинхронное
Результатсразупозже / уведомлением
Связностьтесная: A зависит от Bслабая: A не ждёт B
Сбой получателяломает запрос отправителязадача ждёт в очереди
Пиковая нагрузкабьёт напрямуюсглаживается очередью
Сложностьнижевыше: очередь, мониторинг, статусы

Что когда выбирать

Синхронно — когда результат нужен немедленно для продолжения (проверить пароль, получить баланс, отрисовать страницу). Асинхронно — когда задача долгая или результат не нужен прямо сейчас:

  • отправка письма/пуша — пользователю не надо ждать;
  • обработка видео, генерация отчёта — долго;
  • рассылка событий многим подписчикам;
  • сглаживание пиков: всплеск заказов кладём в очередь и переварим в своём темпе.

Цена асинхронности

Бесплатного нет. Асинхронность усложняет систему: нужно где-то показывать статус задачи, обрабатывать повторы и сбои, мириться с тем, что результат появится не мгновенно (eventual). Не делайте асинхронным то, что естественно синхронно, — получите сложность без выгоды.

Итог

  • Синхронно — результат сразу, но тесная связность и зависимость от получателя.
  • Асинхронно — слабая связность, сглаживание пиков, устойчивость к сбоям получателя.
  • Асинхронность не бесплатна: статусы, повторы, отложенный результат — берите её под конкретную причину.
Проверьте себя
1. В чём ключевое преимущество асинхронного взаимодействия через очередь?
AРезультат всегда приходит быстрее
BСлабая связность: отправитель не ждёт и не зависит от доступности получателя в момент запроса
CНе нужно писать код обработчика
DОно проще синхронного
2. Что из перечисленного лучше делать синхронно?
AКонвертацию загруженного видео
BПроверку пароля при входе — результат нужен немедленно
CМассовую рассылку писем
DГенерацию большого отчёта
3. Какова основная плата за асинхронность?
AНевозможность масштабирования
BРост сложности: статусы задач, обработка повторов и сбоев, отложенный (eventual) результат
CПотеря всех данных
DОбязательная остановка системы
Поддержать проект