带预取的Spring AMQP单用户并行

带预取的Spring AMQP单用户并行,spring,multithreading,rabbitmq,spring-amqp,Spring,Multithreading,Rabbitmq,Spring Amqp,我们有一个项目使用Spring AMQP来使用来自RabbitMQ代理的消息。我们希望增加消费端的并发性,以便多个工作线程可以并行处理消息。我首先阅读了本机RabbitMQ客户机的文档,这使我想到了使用单个使用者和预取计数>1来控制并行性的设计。直接使用RabbitMQ客户机,这似乎很自然。DefaultConsumer的handleDelivery方法可以生成一个新的Runnable,它执行工作并在工作结束时确认消息。预回迁计数有效地控制消费者产生的最大可运行数 然而,这种设计似乎不适合Spr

我们有一个项目使用Spring AMQP来使用来自RabbitMQ代理的消息。我们希望增加消费端的并发性,以便多个工作线程可以并行处理消息。我首先阅读了本机RabbitMQ客户机的文档,这使我想到了使用单个使用者和预取计数>1来控制并行性的设计。直接使用RabbitMQ客户机,这似乎很自然。
DefaultConsumer
handleDelivery
方法可以生成一个新的
Runnable
,它执行工作并在工作结束时确认消息。预回迁计数有效地控制消费者产生的最大可运行数

然而,这种设计似乎不适合Spring AMQP世界。在
SimpleMessageListenerContainer
中,对于每个AMQP使用者,所有消息都会传递到单个
BlockingQueueConsumer
,单个线程会将消息从
BlockingQueueConsumer
的阻止队列传递到
MessageListener
。尽管
SimpleMessageListenerContainer
支持
TaskExecutor
,但
TaskExecutor
仅用于每个使用者运行一个任务。因此,要并行处理多条消息,必须使用多个使用者


这就引出了一些关于Spring AMQP并行性的问题。首先,我最初设计的单消费者和高预取计数是实现AMQP并行性的有效方法吗?如果是这样的话,为什么Spring AMQP会避开这种设计,转而采用按用户线程的设计?是否可以定制Spring AMQP以实现单用户并行性?

Spring AMQP是针对rabbit客户端库的早期版本设计的,该版本每个连接只有一个线程

DefaultConsumer的handleDelivery方法可以生成一个新的Runnable,用于执行工作并在工作结束时确认消息

除了简单地增加
concurrentConsumers
,这并没有给您带来更多的好处——唯一的区别是每个线程都有一个消费者,但没有太多的开销

但是,您可以使用
ChannelAwareMessageListener
执行您想要的操作,并将确认模式设置为
MANUAL
——然后您的侦听器负责确认消息

在2.0(明年)中,我们将有一个替代的侦听器容器,它将直接在客户端库线程上调用侦听器。但是,这是相当多的工作。但它还不是一个功能齐全的容器