如何在 minos 中发布自定义代理消息?

How can I publish custom broker messages in minos?

我想发送一条消息来通知我的一个微服务中的某事,但我不想通过领域事件来实现,这需要创建、更新或删除微服务的实体之一.

是否有另一种发送消息以便另一个微服务可以处理它们的方法?

是的!您可以直接使用在相应服务中注入的 BrokerPublisher 实例来做到这一点。

如果您想发送消息,您可以执行以下操作:

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)

在这种情况下,"MyChannel" 指的是将发送消息的频道(或主题)。

请注意,MyContent 是一个方便的 ModelType,创建它只是为了给消息的内容提供一些结构(但它可以是另一种类型,例如 intstrdict 等等)。

最后,如果你想在另一个微服务中处理它,你可以像处理其他消息一样处理它:

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