首页 文章

具有多个线程的多个消费者的RabbitMQ负载 balancer

提问于
浏览
2

我是RabbitMQ的新手,我的任务是修复正在发生的负载 balancer 错误 .

这是设置:我们使用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(因此兔子均匀地分配给应用程序的每个实例),然后使用执行程序为每个请求启动一个线程(每个实例最多10个线程) .

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

谢谢!

1 回答

  • 2

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

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

    • app1听

    • app2听

    • 消息已分派到app1

    • app1听

    • app3听

    • 消息已分派到app2

    • 消息已发送到app1 ***这不是循环法

    • 消息已分派到app3

    如果您的邮件中没有某种定位信息,那么您的最大努力将与您的流程连接以接收邮件一样有序 .

    但是,如果你的消费者数量为1并将消息传递给执行者并立即收听更多消息,我会打赌你会得到一个非常均匀的分布 .

    我还应该注意,你're going to make ACK/NACK harder in this setup. If you'重新使用Java 8,这里的 CompletableFuture API非常适合从传递的线程中做一些简单的ACK / NACK

相关问题