pythonmicroservicesbrokerminos

How can I publish custom broker messages in minos?


I want to send a message to notify about something in one of my microservices, but I don't want to do that through a domain event, which requires to create, update or delete one of the entities of the microservice.

Is there another way to send a message such that another microservices can handle them?


Solution

  • Yes! You can do that directly using the BrokerPublisher instance injected in the corresponding service.

    If you want to send a message you can do as follows:

    from minos.common import ModelType
    from minos.cqrs import Service
    from minos.networks import Request, enroute
    
    
    MyContent = ModelType.build("MyContent", {"text": str, "number": int})
    
    
    class MySenderService(Service):
    
        @enroute.rest.command("/send/my-channel", "POST")
        async def handle_send_my_channel(self, request: Request) -> Response:
            
            # First, create the message.
            message = BrokerMessageV1(
                "MyChannel", BrokerMessageV1Payload(MyContent("foo", 56))
            )
    
            # Then, send it!
            await self.broker_publisher.send(message)
    

    In this case, "MyChannel" refers to the channel (or topic) on which the message will be sent.

    Note that MyContent is a convenient ModelType created just to give the message's content some structure (but it could be another type, like int, str, dict and so on).

    Finally, if you want to handle it in another microservice, you can do that as any other message:

    from minos.cqrs import Service
    from minos.networks import Request, enroute
    
    
    class MyReceiverService(Service):
    
        @enroute.broker.event("MyChannel")
        async def handle_my_channel(self, request: Request):
    
            # Print the received message's content!
            print(await request.content())