Package: ddd-misc-rabbitmq-transport
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/vhostservice_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- специфичное наименование очереди. При передаче пустой строки будет осуществлена посредством временной очереди!!! Допускается подписка на события собственного сервиса при этом события полученные через брокер
не будут повторно опубликованы в брокер сообщенийПримеры использованияПример использования для публикации событийfromsample_project.bootstapimportmessagebusfromsample_project.domain.eventsimportCompleteEvent,SpecificEventfromdddmisc_rmqimportAsyncRMQEventTransporttransport=AsyncRMQEventTransport(messagebus,'amqps://guest:guest@localhost/vhost','sample_project')transport.register(CompleteEvent,SpecificEvent)Пример использования для подписки на событияfromsample_project.bootstapimportmessagebusfromother_project.eventsimportCompleteEvent,SpecificEventfromdddmisc_rmqimportAsyncRMQEventTransporttransport=AsyncRMQEventTransport(messagebus,'amqps://guest:guest@localhost/vhost','sample_project')transport.consume_to_event('other_project',CompleteEvent)# Подписка на событие CompleteEvent через постоянную очередь sample_projecttransport.consume_to_domain('other_project','other_domain','')# Экслюзивная подписка на события домена через временную очередьtransport.consume_to_service('other_project','sample-queue')# Подписка на все события домена через постоянную очередь sample-queueПример одновренменной подписки и публикации событийfromsample_project.bootstapimportmessagebusfromsample_project.eventsimportSuccessEventfromother_project.eventsimportCompleteEvent,SpecificEventfromdddmisc_rmqimportAsyncRMQEventTransporttransport=AsyncRMQEventTransport(messagebus,'amqps://guest:guest@localhost/vhost','sample_project')transport.register(SuccessEvent)transport.consume_to_event('other_project',CompleteEvent)# Подписка на событие CompleteEvent через постоянную очередь sample_projecttransport.consume_to_domain('other_project','other_domain','')# Экслюзивная подписка на события домена через временную очередьtransport.consume_to_service('other_project','sample-queue')# Подписка на все события домена через постоянную очередь sample-queueПример использования middlewarefromsample_project.bootstapimportmessagebusfromsample_project.eventsimportSuccessEventfromother_project.eventsimportCompleteEvent,SpecificEventimporttypingastfromuuidimportuuid4importcontextvarsascvfromdddmisc_rmqimportAsyncRMQEventTransport,AbstractPublisherMiddleware,AbstractConsumerMiddlewarefromaio_pika.abcimportAbstractMessage,AbstractIncomingMessageclassPublisherMiddleware(AbstractPublisherMiddleware):asyncdef__call__(self,message:AbstractMessage,routing_key:str,publisher:t.Callable[[AbstractMessage,str],t.Coroutine]):message.correlation_id=str(cv.ContextVar('correlation_id').get(uuid4()))returnawaitpublisher(message,routing_key)classConsumeMiddleware(AbstractConsumerMiddleware):asyncdef__call__(self,message:AbstractIncomingMessage,consumer:t.Callable[[AbstractIncomingMessage],t.Coroutine]):cv.ContextVar('correlation_id').set(message.correlation_idoruuid4())returnawaitconsumer(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_projecttransport.consume_to_domain('other_project','other_domain','')# Экслюзивная подписка на события домена через временную очередьtransport.consume_to_service('other_project','sample-queue')# Подписка на все события домена через постоянную очередь sample-queueChangelog0.2.0Add support middlewares0.1.2Add support ddd-misc version >=0.8.1 < 0.9.00.1.1Change exchange type fromFanouttoTopic0.1.0First release