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

标签 c# microservices masstransit saga automatonymous

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

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

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

我的理解是:

事件与命令:

事件:

  • 在服务之间提供松耦合。
  • 向所有队列执行发布,对此类消息感兴趣的服务将选择它。

命令:

  • 执行发送到特定队列,因此只有使用该队列接收的服务才会使用它。

请求/响应与发布/订阅:

请求/响应:

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

发布/订阅:

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

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

我的问题是:

我可以使用带有发布的命令或带有请求/响应的事件吗?

我的理解对吗? sagas 可以与请求/响应一起使用吗?

最佳答案

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

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

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

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

关于c# - 服务事件与命令之间的消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47427629/

相关文章:

c# - 如何在我的代码中处理 IDisposable?

spring - 对假客户端的响应式(Reactive)支持

git - 微服务:众多微服务的源代码如何 stash ?

microservices - MassTransit 请求/响应的目的

c# - 如何处理 DynamicObject 中的通用方法调用?

c# - 在 .netstandard 2.0 上迁移后无法编译简单的动态代码(CodeDom 抛出 System.PlatformNotSupportedException)

kubernetes - StatefulSets 中并行 podManagementPolicy 相对于 OrderedReady podManagementPolicy 的优缺点是什么?

.net - 使用来自 RabbitMQ 的大量(流式)消息

.net - MassTransit 重试策略抛出 System.NullReferenceException :

c# - 可观察到的 : Getting latest value in intervals until source finishes