Skip to main content

RabbitMQ transport for Domain-driven Design Misc

Пакет предоставляет транспортную надстройку на MessageBus пакета ddd-misc для осуществления публикации событий и RPC-вызова команд посредством брокера RabbitMQ.

Классы

Классы объектов

  • AsyncRMQEventTransport - асинхронный класс транспорта выполняющий публикацию и подписку на события
  • SyncRMQEventTransport - синхронный класс транспорта выполняющий публикацию и подписку на события

Сигнатура инициализации классов:

AsyncRMQEventTransport(messagebus: AsyncMessageBus, url: t.Union[str, URL], service_name, *, publish_middlewares: t.Iterable[AbstractPublisherMiddleware] = (), consume_middlewares: t.Iterable[AbstractConsumerMiddleware] = (), **kwargs)

SyncRMQEventTransport(messagebus: MessageBus, url: t.Union[str, URL], service_name, *, publish_middlewares: t.Iterable[AbstractPublisherMiddleware] = (), consume_middlewares: t.Iterable[AbstractConsumerMiddleware] = (), **kwargs)

  • messagebus - инстанс класса шины сообщений используемой в сервисе
  • url - урл подключения к брокеру RabbitMQ формата amqps://user:password@broker-host/vhost
  • service_name - наименование микросервиса, используется:
    • для формирования наименования exchange в который будет осуществляться публикация событий на основании шаблона <service_name>_events
    • используется в качестве наименования очереди для подписки на события по умолчанию
  • prefetch_count - максимальное количество одновременно обрабатываемых событий
  • publish_middlewares - middleware вызываемые при публикации событий
  • consume_middlewares - middleware вызываемые при получении событий по подписке
  • **kwargs - дополнительно возможные расширения параметризации класса транспорта

свойства

  • is_ready - готовность класса принимать/отправлять события
  • service_name - наименование сервиса заданное при ининциализации

методы

  • def register(events: *t.Type[DDDEvent]) - регистрация событий для публикации через брокер
    • events - классы событий
  • def consume_to_service(service_name: str, queue_name: str = None) - метод подписки на все события публикуемые заданным микросервисом
    • service_name - наименование стороннего сервиса, на exchange которого будет осуществлена подписка
    • queue_name - специфичное наименование очереди. При передаче пустой строки будет осуществлена посредством временной очереди
  • def consume_to_domain(service_name: str, domain: str, queue_name: str = None) - метод подписки на все события указанного домена, публикуемые заданным микросервисом
    • service_name - наименование стороннего сервиса, на exchange которого будет осуществлена подписка
    • domain - наименование домена на события которого будет осуществлена подписка
    • queue_name - специфичное наименование очереди. При передаче пустой строки будет осуществлена посредством временной очереди
  • def consume_to_event(service_name: str, event: t.Type[DDDEvent], queue_name: str = None) - метод подписки на конкретное событие, публикуемое данным сервисом
    • service_name - наименование стороннего сервиса, на exchange которого будет осуществлена подписка
    • event - наименование домена на события которого будет осуществлена подписка
    • queue_name - специфичное наименование очереди. При передаче пустой строки будет осуществлена посредством временной очереди

!!! Допускается подписка на события собственного сервиса при этом события полученные через брокер не будут повторно опубликованы в брокер сообщений

Примеры использования

Пример использования для публикации событий

from sample_project.bootstap import messagebus
from sample_project.domain.events import CompleteEvent, SpecificEvent
from dddmisc_rmq import AsyncRMQEventTransport

transport = AsyncRMQEventTransport(messagebus, 'amqps://guest:guest@localhost/vhost', 'sample_project')
transport.register(CompleteEvent, SpecificEvent)

Пример использования для подписки на события

from sample_project.bootstap import messagebus
from other_project.events import CompleteEvent, SpecificEvent
from dddmisc_rmq import AsyncRMQEventTransport

transport = AsyncRMQEventTransport(messagebus, 'amqps://guest:guest@localhost/vhost', 'sample_project')
transport.consume_to_event('other_project', CompleteEvent)  # Подписка на событие CompleteEvent через постоянную очередь sample_project
transport.consume_to_domain('other_project', 'other_domain', '')  # Экслюзивная подписка на события домена через временную очередь
transport.consume_to_service('other_project', 'sample-queue')  # Подписка на все события домена через постоянную очередь sample-queue

Пример одновренменной подписки и публикации событий

from sample_project.bootstap import messagebus
from sample_project.events import SuccessEvent
from other_project.events import CompleteEvent, SpecificEvent
from dddmisc_rmq import AsyncRMQEventTransport

transport = AsyncRMQEventTransport(messagebus, 'amqps://guest:guest@localhost/vhost', 'sample_project')
transport.register(SuccessEvent)
transport.consume_to_event('other_project', CompleteEvent)  # Подписка на событие CompleteEvent через постоянную очередь sample_project
transport.consume_to_domain('other_project', 'other_domain', '')  # Экслюзивная подписка на события домена через временную очередь
transport.consume_to_service('other_project', 'sample-queue')  # Подписка на все события домена через постоянную очередь sample-queue

Пример использования middleware

from sample_project.bootstap import messagebus
from sample_project.events import SuccessEvent
from other_project.events import CompleteEvent, SpecificEvent
import typing as t
from uuid import uuid4
import contextvars as cv
from dddmisc_rmq import AsyncRMQEventTransport, AbstractPublisherMiddleware, AbstractConsumerMiddleware
from aio_pika.abc import AbstractMessage, AbstractIncomingMessage


class PublisherMiddleware(AbstractPublisherMiddleware):

  async def __call__(self, message: AbstractMessage, routing_key: str,
                     publisher: t.Callable[[AbstractMessage, str], t.Coroutine]):
    message.correlation_id = str(cv.ContextVar('correlation_id').get(uuid4()))
    return await publisher(message, routing_key)


class ConsumeMiddleware(AbstractConsumerMiddleware):

  async def __call__(self, message: AbstractIncomingMessage,
                     consumer: t.Callable[[AbstractIncomingMessage], t.Coroutine]):
    cv.ContextVar('correlation_id').set(message.correlation_id or uuid4())
    return await consumer(message)


transport = AsyncRMQEventTransport(messagebus, 'amqps://guest:guest@localhost/vhost', 'sample_project',
                                   publish_middlewares=[PublisherMiddleware()],
                                   consume_middlewares=[ConsumeMiddleware()])
transport.register(SuccessEvent)
transport.consume_to_event('other_project', CompleteEvent)  # Подписка на событие CompleteEvent через постоянную очередь sample_project
transport.consume_to_domain('other_project', 'other_domain','')  # Экслюзивная подписка на события домена через временную очередь
transport.consume_to_service('other_project', 'sample-queue')  # Подписка на все события домена через постоянную очередь sample-queue

Changelog

0.2.0

  • Add support middlewares

0.1.2

  • Add support ddd-misc version >=0.8.1 < 0.9.0

0.1.1

  • Change exchange type from Fanout to Topic

0.1.0

  • First release

Metadata

Release files for ddd-misc-rabbitmq-transport 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ddd-misc-rabbitmq-transport 0.2.0
File Size Uploaded Provenance Actions
ddd_misc_rabbitmq_transport-0.2.0.tar.gz 8.8 kB Without provenance Details for ddd_misc_rabbitmq_transport-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for ddd-misc-rabbitmq-transport 0.2.0
File Interpreter ABI Platform Actions
ddd_misc_rabbitmq_transport-0.2.0-py3-none-any.whl Python 3 none any Details for ddd_misc_rabbitmq_transport-0.2.0-py3-none-any.whl

Total release size: 17.6 kB

Release files / ddd_misc_rabbitmq_transport-0.2.0.tar.gz

Download URL ddd_misc_rabbitmq_transport-0.2.0.tar.gz
Size 8.8 kB
Tags Source
SHA-256 checksum
How to use checksums
ecdd042a16ea0597b5e9001ab3b71ff678ab284886acb07f89eb120dc90b6448
BLAKE2b-256 checksum
How to use checksums
35472bfaf9a192b7298b7c9442ec61296cf5dfa97d090eb8714a5b3aa9753f05
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.9.12 Darwin/23.0.0

Release files / ddd_misc_rabbitmq_transport-0.2.0-py3-none-any.whl

Download URL ddd_misc_rabbitmq_transport-0.2.0-py3-none-any.whl
Size 8.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6a17ae5ead8ab0be9204dddb9ff97bc4c7189e84ed9d04dad811883d72c017ae
BLAKE2b-256 checksum
How to use checksums
c767a4198462906a31cd7f90d454e763b000fe9666517674de635859438fe466
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.9.12 Darwin/23.0.0

Security for ddd-misc-rabbitmq-transport 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page