服务事件与命令之间的消息传递

Messaging Between Services Events vs Commands

我正在尝试了解服务间消息传递所使用的不同方法。

假设我有一个场景,我需要第一个服务通知另一个用户已请求创建产品,第二个服务应该收到此消息,创建一个产品然后响应告诉第一个服务已创建产品。

我认为命令和 request/respond 适合这种情况,因为第一个服务需要解决另一个特定的问题 服务,将等待反馈。

我的理解是:

事件与命令:

事件:

命令:

Request/Respond 对比 Publish/Subsribe:

Request/Respond:

在Request/Respond中,第一个服务从另一个请求执行操作并等待直到从另一个服务返回响应。

Publish/Subscribe:

第一个服务只是发布消息并继续处理,无需等待反馈或响应。

现在我开始使用 RabbitMQ 和 Masstransit saga (Masstransit.Automatonymous) 设计消息传递系统,它似乎遵循带有 publish/subscribe 方法的事件。

我的问题是:

我可以使用带有发布的命令或带有 request/respond 的事件吗?

我的理解对吗? sagas 可以与 request/response 一起使用吗?

总的来说,您的理解是正确的。不过,我也在这里总结一下:

  • 事件在pub/sub中使用。消息被发布,所有订阅者都得到它们。发布者不知道有多少订阅者会收到事件(如果有的话)。
  • 命令发送到已知地址。只有一个订阅者会收到此消息。这是用于火和忘记。
  • 响应也会发送到特定端点,并带有响应地址等附加元数据。所以消费者可以做它需要做的事情并发回回复。这是异步完成的,但发件人等待响应。

具有 Automatonymous 的 MassTransit sagas 支持任何类型的消息处理。您需要将 saga 使用的所有消息映射为状态机事件,但这些消息既可以是命令也可以是事件——从技术上讲这并不重要。 Sagas 可以发布和发送消息,也可以发送请求和等待回复。

如您质疑发布命令和使用事件进行请求-响应。从技术上讲,MassTransit 在消息类型上没有区别。您发布的所有内容都是一个事件。您发送的内容可以是命令,也可以是其他内容,但这不是事件。当你使用请求-响应时,你必须发送到一个特定的端点,所以这绝对不是一个事件。