Синхронное и асинхронное взаимодействие сервисов
↑ 8.3 Микросервисы и распределённые системы · ← Предыдущая · → Следующая
Зачем это на собесе
Ключ к устойчивости: где вызывать напрямую, где событиями.
Объяснение
| Стиль | Технологии | Плюсы | Минусы |
|---|---|---|---|
| Синхронный | REST, gRPC | простота, немедленный ответ | временная связанность, каскадные отказы, накопление задержек |
| Асинхронный | события/команды в брокере | развязка, буфер, устойчивость | eventual consistency, сложнее отладка |
Правила выбора:
- Запрос данных для ответа пользователю — синхронно (с таймаутом, кэшем, fallback).
- Побочные процессы (уведомления, аналитика, пересчёты) — асинхронно, событиями.
- Команды между сервисами с долгим выполнением — через очередь/сагу, ответ 202.
- Избегайте длинных синхронных цепочек A → B → C → D: доступность = произведение доступностей (0,99⁴ ≈ 0,96).
Способы снижения связанности:
| Приём | Как |
|---|---|
| Event-carried state transfer | событие несёт данные, потребитель хранит локальную копию |
| Локальные read-модели | запросы не выходят в сеть |
| Кэш и circuit breaker | переживание сбоя зависимости |
| Outbox | надёжная публикация событий |
| Versioned contracts | совместимая эволюция |
sequenceDiagram participant C as Клиент participant O as Orders participant B as Broker participant P as Payments participant N as Notifications C->>O: POST /orders O-->>C: 202 + id O->>B: OrderCreated B->>P: OrderCreated B->>N: OrderCreated P->>B: PaymentSucceeded B->>O: PaymentSucceeded
Нюансы и подводные камни
- «Асинхронный RPC» (ожидание ответа из очереди) сохраняет связанность.
- Порядок и дубли сообщений: идемпотентность.
- События не должны раскрывать внутреннюю модель: публичные контракты.
- Синхронные вызовы внутри обработчиков сообщений тормозят потребителей.
Практика
- Перерисуйте цепочку синхронных вызовов на смесь sync и событий.
- Посчитайте доступность цепочки из 4 сервисов по 99,9%.
- Реализуйте локальную копию справочника по событиям.
Вопросы с ответами
Что такое временная связанность?
Зависимость, при которой вызывающий работает только пока доступен вызываемый.
Когда выбирать события вместо вызова?
Когда результат не нужен для немедленного ответа и требуется развязка по времени и нагрузке.