OrderCreated или PaymentSucceeded. Producer публикует событие в broker, а независимые consumers подписываются и выполняют свою работу асинхронно.
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.
Оцени свой прогресс