【问题标题】:Messaging Between Services Events vs Commands服务事件与命令之间的消息传递
【发布时间】:2017-11-22 05:47:23
【问题描述】:

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

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

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

我的理解是:

事件与命令:

活动:

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

命令:

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

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

请求/响应:

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

发布/订阅:

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

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

我的问题是:

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

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

【问题讨论】:

    标签: c# microservices masstransit saga automatonymous


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的澄清,“saga 消耗为状态机事件,但这些既可以是命令也可以是事件”这是否意味着我在 saga 中定义为事件类型可以是事件或命令我如何发送消息?
    • 是的,从消费者的角度来看(Saga 只是一群消费者),事件和命令没有区别。这只是一个消息。分开是合乎逻辑的。
    • 我明白了,再次感谢。你遇到过带有 saga 和命令的示例项目吗?
    • 这是我们拥有的示例github.com/MassTransit/Sample-ShoppingWeb/blob/master/src/…,但同样,事件只是消息。 Saga 没有发现任何区别。
    • 自动事件不同于消息。您引用的行是将CartItemAdded 消息绑定到ItemAdded 状态机事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2017-04-21
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多