如何在 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
,创建它只是为了给消息的内容提供一些结构(但它可以是另一种类型,例如 int
、str
、 dict
等等)。
最后,如果你想在另一个微服务中处理它,你可以像处理其他消息一样处理它:
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())
我想发送一条消息来通知我的一个微服务中的某事,但我不想通过领域事件来实现,这需要创建、更新或删除微服务的实体之一.
是否有另一种发送消息以便另一个微服务可以处理它们的方法?
是的!您可以直接使用在相应服务中注入的 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
,创建它只是为了给消息的内容提供一些结构(但它可以是另一种类型,例如 int
、str
、 dict
等等)。
最后,如果你想在另一个微服务中处理它,你可以像处理其他消息一样处理它:
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())