繁体   English   中英

RabbitMQ 多线程多消费者负载均衡

[英]RabbitMQ Load Balancing Across Multiple Consumers with Multiple Threads

我是 RabbitMQ 的新手,我的任务是修复正在发生的负载平衡错误。

这是设置:我们使用 RabbitMQ 在 RPC Api 上运行 Protobuf。

对 api 的请求将发布到 rabbit ,然后由 3 个实例之一使用(API 分布在应用程序的 3 个实例中)。

每个实例设置为使用 10 个线程来处理请求并返回响应。 我们通过设置一个带有 10 个 ConcurrentConsumers 的 SimpleMessageListener 来实现这一点,这会产生 10 个相应的线程来处理每条消息。

这导致:

Instance 1: Consumers 1-10, Instance 2: Consumers 11-20, Instance 3: Consumers 21-30. 

由于 Rabbit 使用循环方法在消费者之间分配负载(相对于在应用程序实例之间分配负载),如果通过 5 条消息,我们最终会看到这样的负载:

Instance 1: Threads 1-5 in use (6-10 idle), Instance 2: Idle, Instance 3: idle. 

我想要发生的是: 5 条消息:

Instance 1: Threads 1,2 in use, Instance 2: threads 1,2 in use Instance 3: Thread 1 in use. 

换句话说,我想根据实例(例如实例 1(消费者 1)、2(11)、3(21)、1(2)、2(12))而不是消费者(例如. 实例1,消费者1-5)。

这可以使用 Spring AMQP (1.2.1) 和 Spring Rabbit (1.2.1) 库吗? 我的第一个想法是将每个实例的并发消费者减少到 1(因此 rabbit 平均分配给应用程序的每个实例),然后使用执行程序为每个请求启动一个线程(每个实例总共最多 10 个线程)。

我还没有看到其他人面临类似的问题,所以我希望有人能给我一些指导! 我主要是想看看我是否可以对我们当前的设置进行配置更改,或者我是否需要手动实现一些东西。

谢谢!

如果你想循环到你的三个服务器,那么我认为你的想法(并发消费者 = 1)是最好的选择。

但您应该注意,它仅与应用程序连接以侦听消息的顺序一样公平,例如:

  1. app1 监听
  2. app2 监听
  3. 发送到 app1 的消息
  4. app1 监听
  5. app3 监听
  6. 发送到 app2 的消息
  7. 消息发送到 app1 *** 这不是循环
  8. 发送到 app3 的消息

如果您的消息中没有某种目标信息,您的最大努力将与您的流程连接以接收消息一样有序。

但是,如果您将消费者数量降至 1,并将消息交给执行程序并立即侦听更多消息,我敢打赌您会得到相当均匀的分布。

我还应该注意,在此设置中,您将使 ACK/NACK 变得更难。 如果您使用的是 Java 8, CompletableFuture API 将非常适合从传递的线程中执行一些直接的 ACK/NACK

您可以通过消费者优先级实现这种行为。 只需为每个实例的每个消费者提供 1-10 的优先级。 由于文档,这应该平均分配工作负载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM