4

我试图了解服务之间消息传递中使用的不同方法。

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

我认为命令以及请求/响应适合这种情况,因为第一个服务将需要处理另一个特定服务并等待反馈。

我的理解是:

事件与命令:

事件:

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

命令:

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

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

请求/响应:

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

发布/订阅:

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

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

我的问题是:

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

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

4

1 回答 1

8

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

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

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

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

于 2017-11-22T09:30:59.537 回答