Skip to main content

An async event bus for RabbitMQ, Redis, and NATS

Project description

📡 aioeventbus

Асинхронная шина событий для RabbitMQ, Redis и NATS

PyPI version Python versions License: MIT

Простая, гибкая и готовая к продакшену библиотека для обмена сообщениями между микросервисами.

aioeventbus предоставляет единый асинхронный API для публикации и подписки на доменные события через популярные брокеры:

  • 🐰 RabbitMQ (fanout-обменники)
  • 🔴 Redis (Pub/Sub)
  • 🚀 NATS (базовая модель подписки)

Смените брокер, отредактировав одну строку в конфиге – код приложения останется неизменным.


✨ Возможности

  • 🔌 Независимость от брокера – одинаковый интерфейс для RabbitMQ, Redis, NATS
  • Полностью асинхронно – построено на asyncio, идеально для FastAPI / Sanic / aiohttp
  • 🧵 Поддержка синхронных обработчиков – ваши хендлеры могут быть обычными функциями; они выполняются в пуле потоков без блокировки event loop
  • 📝 Простая регистрация через декоратор@bus.handler(EventClass)
  • 🔁 Автоматическое переподключение – надёжные соединения для всех брокеров
  • 🛠️ CLI для генерации конфигов – начните работу за секунды
  • 📦 Минимальные зависимости – только библиотеки для выбранного брокера
  • 👌 Удобство использования – единый интерфейс и фабрика create_event_bus скрывают различия между брокерами. Не нужно учить разные API для каждого брокера – достаточно знать один класс EventBus. Конфигурация через YAML или CLI делает переключение брокера делом одной строки, а встроенная обработка ошибок и автоматическое переподключение избавляют от рутины.

📦 Установка

pip install aioeventbus

Дополнительно установите клиентскую библиотеку для нужного брокера:

  • aio-pika для RabbitMQ
  • redis для Redis
  • nats-py для NATS

🚀 Быстрый старт

1. Создайте конфигурационный файл

Файл config.yaml:

broker: rabbitmq        # rabbitmq, redis, nats
host: localhost
port: 5672              # порты по умолчанию: RabbitMQ=5672, Redis=6379, NATS=4222
exchange: domain_events # для RabbitMQ
max_workers: 10

Или сгенерируйте его через CLI:

aioeventbus init --broker nats --output config.yaml

2. Определите события домена

from dataclasses import dataclass
from aioeventbus import DomainEvent

@dataclass
class OrderCreated(DomainEvent):
    __event_type__ = "OrderCreated"
    order_id: str
    customer_id: str
    amount: float

3. Зарегистрируйте обработчики

from aioeventbus import create_event_bus

bus = create_event_bus("config.yaml")

@bus.handler(OrderCreated)
def notify_admin(event: OrderCreated):
    print(f"[ADMIN] Новый заказ {event.order_id} от {event.customer_id}")

@bus.handler(OrderCreated)
def start_fulfillment(event: OrderCreated):
    print(f"[FULFILLMENT] Обработка заказа {event.order_id}")

4. Запустите потребителя (например, в lifespan FastAPI)

from contextlib import asynccontextmanager
from fastapi import FastAPI

@asynccontextmanager
async def lifespan(app: FastAPI):
    await bus.start_consuming()
    yield
    await bus.stop_consuming()

app = FastAPI(lifespan=lifespan)

5. Публикуйте события из любого места

@app.post("/orders")
async def create_order(order_id: str, customer_id: str, amount: float):
    event = OrderCreated(order_id, customer_id, amount)
    await bus.publish(event)
    return {"status": "ok"}

📂 Конфигурация

Библиотека использует YAML-файл конфигурации. Пример для каждого брокера:

RabbitMQ
broker: rabbitmq
host: localhost
port: 5672
exchange: domain_events
max_workers: 10
durable: false        # временная очередь (удаляется при остановке потребителя)
Redis
broker: redis
host: localhost
port: 6379
channel: domain_events
max_workers: 10
NATS
broker: nats
host: localhost
port: 4222
subject: domain_events
max_workers: 10

Все поля, кроме broker, опциональны – значения по умолчанию совпадают с примерами выше.


🧰 CLI утилита

aioeventbus поставляется с интерфейсом командной строки:

aioeventbus init --broker redis --output my_config.yaml

Опции:

  • --broker – выберите rabbitmq, redis или nats
  • --output – путь к выходному файлу (по умолчанию eventbus_config.yaml)
  • --host, --port, --exchange, --channel, --subject, --max-workers – переопределить значения по умолчанию

🧪 Пример с FastAPI

Полный пример находится в директории examples/fastapi_app.

Запустите его:

cd examples/fastapi_app
pip install -r requirements.txt   # fastapi, uvicorn, aioeventbus
uvicorn main:app --reload

Затем выполните запросы:

curl -X POST "http://localhost:8000/orders?order_id=123&customer_id=alice&amount=99.9"
curl -X POST "http://localhost:8000/orders/123/pay?payment_id=pay_456"

В терминале появятся сообщения от зарегистрированных обработчиков.


🏗️ Архитектура

Библиотека построена вокруг абстрактного класса EventBus:

class EventBus(ABC):
    def handler(self, event_cls): ...
    async def publish(self, event) -> None: ...
    async def start_consuming(self) -> None: ...
    async def stop_consuming(self) -> None: ...

Три конкретные реализации: RabbitMQEventBus, RedisEventBus и NatsEventBus.
Фабрика create_event_bus читает ваш конфиг и возвращает нужный экземпляр.

  • Потребители автоматически создают временные очереди (или подписки), так что каждый подписчик получает копию каждого события.
  • Синхронные обработчики запускаются в пуле потоков, чтобы не блокировать event loop asyncio.
  • Соединения управляются надёжно – они автоматически переподключаются при обрыве связи с брокером.

🤝 Участие в разработке

Приветствуются любые вклады!
Пожалуйста, ознакомьтесь с трекером задач и отправляйте pull request с понятным описанием изменений.

  1. Сделайте форк репозитория
  2. Создайте ветку для новой функциональности
  3. Установите зависимости для разработки: pip install -e .[dev]
  4. Запустите тесты: pytest
  5. Отправьте pull request

📄 Лицензия

Этот проект распространяется под лицензией MIT – подробности в файле LICENSE.


🙌 Благодарности

Создано с ❤️ с использованием:


Приятной событийно-ориентированной разработки! 🚀

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aioeventbus-0.1.0.tar.gz (9.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aioeventbus-0.1.0-py3-none-any.whl (12.1 kB view details)

Uploaded Python 3

File details

Details for the file aioeventbus-0.1.0.tar.gz.

File metadata

  • Download URL: aioeventbus-0.1.0.tar.gz
  • Upload date:
  • Size: 9.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for aioeventbus-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1c01b91d41934c1c6618ea2211e08c6c7d7a929f0092e02544f6386851f5eea9
MD5 c82f9b31fc0ac7c7cdca42909cedcc98
BLAKE2b-256 a0e1f2d824f04a95f8b8bbc37ec88bb825c53b818d8537c7a6170f4982bb1c07

See more details on using hashes here.

File details

Details for the file aioeventbus-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: aioeventbus-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for aioeventbus-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d90b33e0bdada7c005c741a19b1828b5585e7840b64de058c3cca1173db74ea3
MD5 071be3ae8cce19e6b66a36736e7b3c37
BLAKE2b-256 db7408bacf4f717a4298932464bbe07e12ab46129fde5c59a8b41be1e0b08310

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page