[英]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,并将消息交给执行程序并立即侦听更多消息,我敢打赌您会得到相当均匀的分布。
我还应该注意,在此设置中,您将使 ACK/NACK 变得更难。 如果您使用的是 Java 8, CompletableFuture
API 将非常适合从传递的线程中执行一些直接的 ACK/NACK
您可以通过消费者优先级实现这种行为。 只需为每个实例的每个消费者提供 1-10 的优先级。 由于文档,这应该平均分配工作负载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.