How can I publish custom broker messages in minos?

71 Views Asked by At

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?

1

There are 1 best solutions below

0
On BEST ANSWER

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())