tun*_*ood 6 java spring multithreading rabbitmq
我对 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.
Run Code Online (Sandbox Code Playgroud)
由于 Rabbit 使用循环方法在消费者之间分配负载(而不是在应用程序的实例之间分配负载),如果有 5 条消息通过,我们最终会看到如下负载:
Instance 1: Threads 1-5 in use (6-10 idle), Instance 2: Idle, Instance 3: idle.
Run Code Online (Sandbox Code Playgroud)
我希望发生的是: 5 条消息:
Instance 1: Threads 1,2 in use, Instance 2: threads 1,2 in use Instance 3: Thread 1 in use.
Run Code Online (Sandbox Code Playgroud)
换句话说,我想根据实例(例如实例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
归档时间: |
|
查看次数: |
7918 次 |
最近记录: |