Паттерн "Шина событий" (Event Bus) — это архитектурный подход, позволяющий реализовать коммуникацию между компонентами системы через публикацию и прослушивание событий. При этом компоненты не знают друг о друге напрямую, происходит слабосвязанное взаимодействие по принципу "издатель-подписчик".
Использование: Этот паттерн полезен там, где необходимо обеспечить масштабируемое, расширяемое взаимодействие между множеством модулей — например, в сложных веб-приложениях, десктопных системах, микросервисных платформах.
Пример кода на Python с использованием библиотеки pyee:
from pyee import EventEmitter bus = EventEmitter() def on_user_created(user): print(f"Создан пользователь: {user}") bus.on('user_created', on_user_created) bus.emit('user_created', {"id": 1, "name": "Иван"})
Ключевые особенности:
Все ли события в Event Bus должны быть персистентными?
Нет, не обязательно. В большинстве случаев Event Bus оперирует ephemeral (летучими) событиями, которые не сохраняются. Персистентность нужна только, если важна невозможность потери событий (например, через Kafka).
Потеряется ли событие, если ни один подписчик не зарегистрирован на момент публикации?
Да, если система не сохраняет события (ephemeral), то событие будет утеряно. Для гарантированной доставки нужен durable Event Bus (например, RabbitMQ с персистентными очередями).
Можно ли использовать один Event Bus для синхронного и асинхронного кодов без ограничений?
Нет, синхронный Event Bus может блокировать поток до завершения всех обработчиков, что неприемлемо для высокой нагрузки. Для масштабируемых систем используют асинхронные Event Bus или выносят обработку событий в отдельные процессы/потоки (например, через Celery).