【问题标题】:RabbitMQ with Microservices - How to deal with scaled services?带有微服务的 RabbitMQ - 如何处理规模化的服务?
【发布时间】:2020-02-27 02:15:08
【问题描述】:

我是 RabbitMQ 的新手。我想为其他服务举办“整合活动”。 所以是所有微服务的消息路由。

但是,如果我有复制服务以进行扩展,我不希望所有复制的服务都接收到消息。

示例:
>>> 服务 B(获取消息)
服务 A > 推送消息 >>> 服务 B(不应该收到消息,被复制)
>>> 服务 C(获取消息)

我认为这是我需要的“routing”和“work queues”的组合?
但我怎样才能正确地做到这一点?如果您有示例,我使用 Node.js 或 C#。

【问题讨论】:

    标签: c# node.js rabbitmq microservices


    【解决方案1】:

    我在 here 中有我的微服务和 DDD 信息。看看

    如果您想将事件发布到特殊服务,那么您应该使用服务总线。 我使用NServiceBus。它是 .net 中最好的工具。 RabbitMQ 只是一个队列。在 NServiceBus 中,您可以使用许多不同的queues,例如 RabbitMQ 、 SqlServer 等

    现在对于您的示例,服务 A 发布一个事件,假设是 UserCreated。服务 B 有一个 EventHandler 作为 UserCreatedEventHandler。 Sine 然后服务 B 可以获取 UserCreated 的任何已发布事件。 NServiceBus 有Automatic subscriptionsMessage routing 知道什么服务订阅了哪些事件。他们的文件完美无缺。看看他们

    【讨论】:

      【解决方案2】:

      扩大您的服务(您的消费者)在这种情况下不是问题。相反,它是队列工作方式的一个特征。

      简而言之,如果您有一个服务实例从一个队列消费,或者您有十个实例从同一个队列消费,这并不重要。只有一个消费者会从该队列接收相同的消息。将此视为以round-robin 方式分发的消息。

      如果您想将相同的消息发送给多个消费者,您必须(最终)将其发布到不同的队列中。也就是说,每个消费者都应该监听一个特定的队列,并且您的交换器在所有队列上发布消息。 扇出交换可能在这里工作。

      【讨论】:

      • 我希望所有服务同时获取消息(“路由”)。但是,如果调用了一个微服务,那么它应该只能获得一个(“工作队列”ala round-robin)。所以我需要“路由”和“工作队列”的组合。我只是不知道如何在 Node.js 中实现它。对于 C# NServiceBus 听起来不错,只是它是一个商业产品。
      • 阅读exchange types 和路由密钥,因为我很确定您的大多数问题都可以在不进入服务总线兔子洞的情况下得到解决,可以这么说。考虑使用更具体的示例更新您的问题,以便我们更好地帮助您。
      猜你喜欢
      • 1970-01-01
      • 2020-05-28
      • 2022-07-06
      • 2018-10-30
      • 2021-01-12
      • 2017-05-08
      • 2020-03-03
      • 2017-11-09
      • 1970-01-01
      相关资源
      最近更新 更多