【问题标题】:Event Driven Architecture on Multi-instance services多实例服务的事件驱动架构
【发布时间】:2019-11-06 14:38:27
【问题描述】:

我们在项目中使用微服务架构。我们使用 Kubernetes 将每个服务部署到集群中。服务是使用 Java 编程语言和 Spring Boot 框架开发的。每个服务存在三个副本。服务之间仅使用事件进行通信。 RabbitMQ 用作消息队列。其中一项服务用于发送电子邮件。电子邮件的详细信息由另一个服务与事件一起提供。当服务发布 SendingEmail 事件时,电子邮件服务的三个副本会消费该事件,并发送 3 次相同的电子邮件。 如何防止其他两个服务发送电子邮件?

【问题讨论】:

  • 您使用什么类型的交换来发布活动?听起来您正在使用fanout exchange。如果您改用direct exchange,您可能可以解决您的问题。这将保证只有其中一个人会收到消息。

标签: spring-boot microservices event-driven event-driven-design


【解决方案1】:

我认为这取决于您如何使用 Rabbit MQ。

您可以为这些事件配置一个带有一个队列的rabbit mq,并使代表发送服务器的spring boot应用程序成为“竞争”消费者。

如果你像这样配置它,一次只有一个副本会收到一个事件,只有当它无法处理它时,消息才会返回队列并可供其他消费者使用。

根据您所描述的,他们都在收到消息,所以它就像一个 pub-sub 一样工作(这也是一种可能的使用 rabbit mq 的方式,在这种情况下它只是不好)。

【讨论】:

  • 如何设计一个实例只使用特定事件?也许所有实例都需要使用其他事件。
  • 你应该阅读rabbit mq中的各种交换类型和路由键。它非常灵活一般来说,您可以进行交换以将消息“复制”到 N 个队列(N = 副本中的实例数),并且每个队列将有一个消费者 => 它是一个 pub-sub,可能是您现在所拥有的。或者,您可以将交换配置为仅发送到一个队列,并且所有副本都将成为该队列的竞争消费者。在这种情况下,一次只有一个消费者会收到消息