将微服务与事件同步(RabbitMQ)

时间:2019-09-04 08:43:24

标签: rabbitmq microservices

我们正在使用微服务架构在nodejs中实现Web-API。每个服务都公开HTTP端点,因此应用程序/网站可以与其交互。为了同步不同的数据库,我们目前正在使用RabbitMQ。微服务可以在扇出交换上发布消息,每个订阅的微服务都会收到该消息。

此体系结构存在两个问题。

  1. 如果我们想添加第二个微服务实例(出于负载平衡等目的),该怎么办。如果第二项服务将订阅相同的扇出交换,则消息将被使用两次。

  2. 任何一种确认都不适用于扇出交换,或者我做错了。当我在没有订阅者的扇出交换机上发布消息时,这些消息会立即消失而不会被确认。

这使我想到了我的问题。 RabbitMQ是微服务同步的理想选择还是我们应该更改架构。这是我希望它如何工作的简短示例:

  1. 用户创建一个新帐户
  2. auth-mc将用户插入其数据库并发布“ user.created”事件
  3. a1-mc,a2-mc(相同的mc,只是负载均衡)和b1-mc是交换的订户。 a1或a2以及b1接收事件并将用户插入各自的数据库中
  4. 该事件仅在确认后从每个微服务队列中删除

这样,我可以确定,每个微服务(无论是否负载均衡)都会收到一次消息。甚至可以使用RabbitMQ来实现这种模式吗?

编辑:如果有任何建议,还寻找有关微服务的良好文献。

1 个答案:

答案 0 :(得分:1)

出于您的目的,请使用topic交换而不是fanout。只有一个消费者将收到消息,而不是全部。您可以根据routing_key参数为不同的使用者发送消息。例如,您有一个交换。您使用相同的路由密钥将三个不同的队列绑定到此交换。您的消息将在每个队列中重复!您来自不同微服务的消费者可以分别阅读该消息并做他们需要的事情。除非您确认该消息,否则不会删除该消息,但这是使用TTL推送消息的一种好习惯。