Что такое event-driven архитектура и как ее применять
Что проверяют
Понимаете ли вы, чем событие отличается от вызова, и знаете ли цену асинхронности: доставку «хотя бы один раз», порядок, согласованность данных. Следом спрашивают, как вы гарантируете, что событие не потеряется между записью в базу и отправкой в брокер.
Как отвечать
Event-driven архитектура это стиль, где сервисы общаются фактами о том, что уже произошло: OrderPlaced, PaymentFailed. Производитель публикует событие и не знает, кто его обработает, потребители подписываются сами. Этим событие отличается от команды, у которой один адресат и ожидание результата.
Каркас ответа:
- брокер: Kafka для потоков с хранением и повторным чтением, RabbitMQ для маршрутизации и очередей, Redis Streams или NATS для лёгких сценариев. В Python это
aiokafkaилиconfluent-kafka,aio-pika, поверх них фреймворк FastStream; - семантика доставки: на практике почти всегда at-least-once, поэтому обработчик обязан быть идемпотентным: ключ события пишут в таблицу обработанных или делают upsert;
- transactional outbox: событие сохраняется в таблицу
outboxв той же транзакции, что и бизнес-данные, а отдельный процесс или Debezium переносит его в брокер. Так не бывает «записали в базу, но не отправили»; - порядок: в Kafka он гарантирован только внутри партиции, поэтому события одного заказа отправляют с одним ключом;
- ошибки: повторы с задержкой, DLQ для «ядовитых» сообщений, версионирование схемы событий через Avro или Protobuf и реестр схем;
- когда применять: много независимых реакций на одно действие, интеграция сервисов разных команд, аудит. Для CRUD, где клиенту нужен ответ сразу, синхронный вызов проще.
Где спотыкаются
Путают EDA с очередью задач. Celery или asyncio.Queue внутри процесса это способ выполнить работу в фоне, а не архитектура обмена событиями между сервисами.
Делают двойную запись: коммит в базу, потом producer.send(). Падение между ними даёт рассинхрон, который потом ищут неделями.
Обещают, что система станет отказоустойчивой сама собой. На деле появляется eventual consistency, нужна трассировка через correlation id, и без неё отладка цепочки из пяти сервисов превращается в угадывание.