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

时间:2017-11-22 05:47:23

标签: c# microservices masstransit saga automatonymous

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

让我们说我有一个场景,我需要第一个服务通知对方用户要求创建产品,第二个服务应该收到此消息,创建产品然后回复告诉第一个服务产品已经创建。

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

我的理解是:

事件与命令:

活动:

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

命令:

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

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

请求/回应:

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

发布/订阅:

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

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

我的问题是:

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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