代码之家  ›  专栏  ›  技术社区  ›  Yahya Hussein

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

  •  4
  • Yahya Hussein  · 技术社区  · 7 年前

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

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

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

    我的理解是:

    事件与命令:

    事件:

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

    命令:

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

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

    请求/响应:

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

    发布/订阅:

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

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

    我的问题是:

    我可以将命令用于发布还是将事件用于请求/响应?

    我的理解正确吗?佐贺可以用于请求/响应吗?

    1 回复  |  直到 7 年前
        1
  •  8
  •   Andrzej Gis    6 年前

    总的来说,你的理解是正确的。然而,我也将在这里总结:

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

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