在 MasstTransit 中发送、发布和请求/响应

Moh*_*mad 1 domain-driven-design masstransit event-driven-design microservices

最近我尝试在我们的微服务生态系统中使用MassTransit

根据 MassTransit 词汇和文档,我的理解是:

  • 发布:向 1 个或多个订阅者发送消息(发布/订阅模式)以传播消息。
  • Send:用于像发布一样以一劳永逸的方式发送消息,但它仅用于一个接收者。与发布的主要区别在于,在发送中如果您的目的地没有收到消息,它将返回异常。
  • 请求:使用请求/回复模式仅发送消息并在不同的通道中获取响应,以便能够从接收者获取响应值。

现在,我的问题是根据微服务的理念,遵循事件驱动的设计,我们使用Publish将消息(事件)传播到整个生态系统。但这里的Send到底有什么用法(用例)呢?只是为了在接收者不存在时获得异常?

我的下一个问题是,在微服务生态系统中同时使用PublishSendRequests是一种好方法吗?例如发布传播事件、发送命令(即发即忘)以及从目的地获取响应的请求。

----- 更新 我还发现克里斯·帕特森在这里澄清了很多事情。这对我也有很大帮助。

Ale*_*rev 6

您的问题与大众交通无关。MassTransit 实现了在流行资源(例如企业集成模式)上经过深思熟虑描述的众所周知的消息传递模式

正如 Eben 在他的回答中所写,使用哪种模式的决定是由意图驱动的。每种模式的消息传递机制也存在技术差异。

发送用于命令,您告诉其他服务做某事。尽管您可能通过其他方式(例如事件)获得操作成功或失败的确认,但您不会等待回复(即发即忘)。

在此输入图像描述

它是点对点通道的实现,您还可以在其中实现竞争消费者来扩展处理,但这些将是同一服务的实例。

对于使用 RabbitMQ 的 MassTransit,它是通过将消息发布到端点交换而不是消息类型交换来完成的,因此即使其他端点可以使用该消息,也不会获取该消息。

发布是为了事件。这是一种广播类型的传送或扇出。您可能正在发布没有人在监听的事件,因此您并不真正知道谁将使用它们。您也不期望任何回应。

在此输入图像描述

它是发布-订阅通道的实现。

MassTransit 与 RabbitMQ 为发布的每种消息类型创建交换并将消息发布到这些交换。消费者在其端点交换和消息交换之间创建绑定,因此每个消费者服务(不同的应用程序)将在其独立的队列中获取这些绑定。

请求-响应既可以用于需要确认的命令,也可以用于查询。

在此输入图像描述

它是请求-答复消息模式的实现。

MassTransit在文档中提供了很好的图表,解释了 RabbitMQ 的机制。

这些消息传递模式经常以不同的组合和变体用于复杂的分布式系统中。