PRO

Что такое событийно-ориентированная архитектура (Event-Driven)?

Событийно-ориентированная архитектура строится вокруг фактов, которые уже произошли в системе, например OrderCreated или PaymentSucceeded. Producer публикует событие в broker, а независимые consumers подписываются и выполняют свою работу асинхронно.
Подробный ответ

Что такое событие

Событие — неизменяемый факт о прошлом, сформулированный в прошедшем времени: UserRegistered, OrderCancelled, InvoicePaid. Оно сообщает, что что-то уже произошло, а не приказывает другому сервису выполнить действие.

Базовая схема

Order service
  |
OrderCreated event
  |
Message broker
  |
+-------------+--------------+
|                            |
Notification service      Analytics service
Send email                Update metrics

Преимущества

  • producer слабо связан с consumers;

  • новый consumer можно добавить без изменения producer;

  • асинхронная обработка помогает сгладить нагрузку;

  • сервисы можно масштабировать независимо.

Сложности

  • eventual consistency и отсутствие мгновенной синхронизации данных;

  • возможность повторной доставки сообщений;

  • необходимость schema versioning, DLQ, retries и observability;

  • сложнее отследить полный путь одного пользовательского запроса.

Надёжная публикация

Если сервис сначала сохраняет данные в БД, а затем отдельно публикует событие, возможна потеря события при сбое между этими действиями. Для снижения риска применяют transactional outbox: запись и событие сохраняются в одной транзакции, а отдельный worker надёжно отправляет событие в broker.

Идемпотентность consumer

Consumer должен безопасно обрабатывать дубликаты, потому что at-least-once delivery может доставить одно событие несколько раз. Для этого применяют event ID, таблицу обработанных событий, idempotency key или уникальные ограничения в БД.

Как ответить на собеседовании

Event-driven архитектура использует события как способ слабосвязанного асинхронного взаимодействия сервисов. Producer публикует факт, broker доставляет его consumer-ам. Я учитываю eventual consistency, schema evolution, retries, DLQ и идемпотентность обработчиков. Для надёжной связи БД и публикации событий использую outbox pattern.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге