Ответ
Событийно-ориентированная архитектура (Event-Driven Architecture, EDA) — это шаблон проектирования, в котором компоненты системы взаимодействуют друг с другом посредством асинхронной отправки и получения сообщений о событиях.
Основные компоненты:
- Producer (Источник): Компонент, который генерирует событие (например,
UserRegistered
,OrderPlaced
). Он не знает, кто будет обрабатывать это событие. - Consumer (Потребитель): Компонент, который подписывается на определённые типы событий и реагирует на них.
- Event Broker/Channel (Брокер/Канал): Посредник, который принимает события от источников и доставляет их потребителям. Примеры: RabbitMQ, Apache Kafka, Redis Pub/Sub.
Ключевое преимущество — слабая связанность (loose coupling). Компоненты не зависят друг от друга напрямую, что позволяет изменять, масштабировать или заменять их независимо.
Пример на Python с asyncio
(упрощенная концепция):
import asyncio
# Упрощенный "канал" событий
event_queue = asyncio.Queue()
async def producer():
# Источник генерирует событие
print("Producer: Пользователь зарегистрировался.")
await event_queue.put({"event_type": "user_registered", "user_id": 123})
await asyncio.sleep(1)
async def consumer():
# Потребитель ожидает и обрабатывает событие
event = await event_queue.get()
if event["event_type"] == "user_registered":
print(f"Consumer: Отправляем приветственное письмо пользователю {event['user_id']}.")
event_queue.task_done()
async def main():
# Запускаем потребителя в фоне
asyncio.create_task(consumer())
# Запускаем источник
await producer()
await event_queue.join()
asyncio.run(main())
Плюсы:
- Масштабируемость: Легко добавлять новых потребителей для обработки событий.
- Отказоустойчивость: Сбой одного компонента не приводит к отказу всей системы.
- Асинхронность: Система остается отзывчивой под нагрузкой.
Минусы:
- Сложность отладки: Трудно отследить полный путь обработки одного запроса.
- Гарантии доставки: Требуется дополнительная логика для обеспечения доставки и обработки событий.