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

将微服务与事件同步(RabbitMQ),rabbitmq,microservices,Rabbitmq,Microservices,我们正在使用微服务架构在nodejs中实现Web API。每个服务都公开HTTP端点,以便应用程序/网站可以与其交互。为了同步不同的数据库,我们目前正在使用RabbitMQ。微服务可以在扇出交换上发布消息,并且每个订阅的微服务都会收到该消息 这种架构有两个问题 如果我们想添加微服务的第二个实例(用于负载平衡等),该怎么办。如果第二个服务订阅相同的扇出交换,则消息将被消耗两次 要么确认与扇出交换不起作用,要么我做错了什么。当我在没有订阅者的扇出式exchange上发布消息时,消息会立即消失而不被确

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

这种架构有两个问题

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

  • 要么确认与扇出交换不起作用,要么我做错了什么。当我在没有订阅者的扇出式exchange上发布消息时,消息会立即消失而不被确认

  • 这就引出了我的问题。RabbitMQ是微服务同步的好选择还是我们应该改变我们的体系结构。以下是我希望它如何工作的一个简短示例:

  • 用户创建一个新帐户
  • auth mc将用户插入其数据库并发布“user.created”事件
  • a1 mc、a2 mc(相同的mc,只是负载平衡)和b1 mc是exchange的订户。a1或a2以及b1接收事件并将用户插入各自的数据库
  • 只有在事件被确认后,才会从每个microservices队列中删除该事件
  • 通过这种方式,我可以确定,每个微服务(负载平衡与否)都会收到一次消息。甚至可以使用RabbitMQ实现这样的模式吗


    编辑:如果有任何建议,也可以查找有关微服务的优秀文献。

    让我们使用
    主题
    交换,而不是
    扇出
    。只有一个消费者会收到消息,而不是所有消费者。您可以根据
    routing_key
    params为不同的消费者路由消息。例如,您有一个交换。您有三个使用相同路由密钥绑定到此exchange的不同队列。您的消息将为每个队列复制!来自不同微服务的消费者可以分别阅读信息并做他们需要的事情。在您确认之前,邮件不会被删除,但使用TTL推送邮件是一种很好的做法。

    这似乎可以按预期工作,非常感谢!还有一些事情我不确定。您是为每个微服务创建一个频道,还是为每个订阅/发布创建一个频道?您如何处理未确认或过期的邮件?如果我只是重新查询消息,服务可能会重复获取中断的消息并陷入死锁。我是否应该冒险,回滚所有更改,或者在死信交换中重新查询消息?您可以为每个发布/订阅创建一个交换,但为每个微服务创建一个队列。您的生产者将消息推送到exchange(这是它的一个单点),消费者将其队列绑定到exchange并从此处接收消息。如何处理数据丢失、比赛条件等,取决于具体情况。您有不同的方法来处理这个问题,例如构建RPC模型、锁定机制等。