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

时间:2014-10-13 17:49:52

标签: java multithreading rabbitmq

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

  

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

     

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

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

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

1 个答案:

答案 0 :(得分:6)

您提到的线程池不是DefaultConsumer的一部分,而是ConnectionChannel之间共享的DefaultConsumer的一部分。它允许并行调用不同的消费者。请参阅this part of the guide

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

有一个很大的警告:无论线程池中有多少线程,流经单个通道的传入消息都会被串行处理。它只是实现ConsumerWorkService的方式。

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

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

有关详细信息,请查看this post