【问题标题】:RabbitMQ - How to handle 2 asynchronous messages as consuming microservice? [closed]RabbitMQ - 如何处理 2 条异步消息作为消费微服务? [关闭]
【发布时间】:2018-09-02 04:27:07
【问题描述】:

我有一个问题正在寻找解决问题的最佳方法。我们目前正在努力用微服务架构取代我们的软件单体。

我们希望使用消息队列作为不同微服务之间的通信。

我们的一个微服务(邮件服务)需要在收到来自两个多个微服务的两条消息后做出反应。第一条消息提供有关已下订单的信息。它提供有关电子邮件内容和收件人的信息,第二条消息提供附件链接,电子邮件应包括。

邮件服务应该等到两封邮件都收到。目前我计划将所有消息存储到数据库中(每条消息一个表)并每 5 秒检查一次是否存在两个信息并且可以发送电子邮件。

但我觉得也许 RabbitMQ 也提供了一种方法,所以我不需要自己开发来避免这两条消息之间的竞争条件。

您有什么方法来解决这个问题?

【问题讨论】:

  • 听起来您有一个编排(由任一消息触发,并且可能与消息中的某些数据相关)。 Akka 可能是一种选择,但如果您的企业中有很多这样的要求,那么可能值得考虑使用规则引擎或事件流处理器,例如流口水。

标签: java c# rabbitmq message-queue microservices


【解决方案1】:

我会更改消息模式,以便您拥有三条消息;

  1. 发布第一条消息,其中包含订单信息。使用此消息的结果是发布包含附加信息的第二条消息。

  2. 处理包含附加信息的第二条消息并保留该信息。这是您发布第三条消息的地方。

  3. 第三条也是最后一条消息作为通知说“嘿,我现在拥有实际发送电子邮件所需的一切”。

这样您不必每 x 秒检查一次数据库,并且可以相当便宜地扩展消息工作流程。

希望有帮助:)

【讨论】:

  • 您好,感谢您的努力。我想我理解你的方法,但可以肯定的是......是这样的吗?第一条消息是订单信息消息,从订单微服务发送到邮件微服务。然后,邮件微服务向正在创建文档的文档创建服务发送一条消息,说:“嘿,我需要一些文档”。然后文档服务创建该文档并将消息发送回邮件服务。这已经是一种改进,但是您将如何临时存储第一条消息的信息?内部数据库?
  • @DominikHeim 在最后一条消息中,我将发送另一端所需消息的所有内容。或者如果需要告诉消息在哪里可以找到内容(例如数据库)。
猜你喜欢
  • 2021-07-04
  • 2016-05-04
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 2012-10-08
相关资源
最近更新 更多