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

↑ 8.3 Микросервисы и распределённые системы · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Ключ к устойчивости: где вызывать напрямую, где событиями.

Объяснение

СтильТехнологииПлюсыМинусы
Синхронный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» (ожидание ответа из очереди) сохраняет связанность.
  • Порядок и дубли сообщений: идемпотентность.
  • События не должны раскрывать внутреннюю модель: публичные контракты.
  • Синхронные вызовы внутри обработчиков сообщений тормозят потребителей.

Практика

  1. Перерисуйте цепочку синхронных вызовов на смесь sync и событий.
  2. Посчитайте доступность цепочки из 4 сервисов по 99,9%.
  3. Реализуйте локальную копию справочника по событиям.

Вопросы с ответами

Связанные темы