Rabbit客户端中的RabbitMQ通道和线程

Cpt*_*ard 2 java multithreading rabbitmq

我想快速确认一下我怀疑这部分RabbitMQ文档说:

消费者的回调是在与Connection管理的线程分开的线程上调度的.这意味着消费者可以安全地在Connection或Channel上调用阻塞方法,例如queueDeclare,txCommit,basicCancel或basicPublish.

每个Channel都有自己的调度线程.对于每个渠道一个消费者的最常见用例,这意味着消费者不会阻止其他消费者.如果每个频道有多个消费者,请注意长时间运行的消费者可能会阻止向该频道上的其他消费者发送回调.

我有各种命令(消息)通过单个入站队列进入,并且通道附加了一个DefaultConsumer.假设DefaultConsumer中有一个线程池让我直接从消费者回调方法运行应用程序逻辑,并且我没有阻止后续命令的处理,这是正确的吗?如果看起来有瓶颈,我可以给RMQ一个更大的线程池吗?

此外,偶尔会有来自其他线程的同一频道的basicPublish.我认为这确实阻止了消费者?我想在这样做时我应该使用一个新频道?

whe*_*eph 6

你提到的线程池不是它的一部分,DefaultConsumer而是Connection它的Channels和DefaultConsumers 之间共享的一部分.它允许并行调用不同的消费者.请参阅本指南的这一部分.

所以你会期望通过增加线程池的大小,你可以达到更高的并行度.然而,这不是影响它的唯一因素.

有一个很大的警告:无论线程池中有多少线程,流经单个通道的传入消息都会被串行处理.这就是如何ConsumerWorkService实施的方式.

因此,为了能够同时使用传入消息,您可以管理多个通道或将这些消息放入单独的线程池中.

发布不使用来自Connections线程池的线程,因此它们不会占用消费者.

有关详细信息,请查看此帖子.