当前位置: 首页 > 知识库问答 >
问题:

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

谈阎宝
2023-03-14

每个通道都有自己的分派线程。对于每个渠道一个消费者的最常见用例,这意味着消费者不会拖住其他消费者。如果每个通道有多个使用者,请注意长时间运行的使用者可能会阻碍回调到该通道上其他使用者的调度。

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

此外,偶尔还有一个来自其他线程的basicPublish到同一通道。我认为这确实会拖累消费者?我想我应该利用一个新的渠道做这件事?

共有1个答案

百里泓
2023-03-14

您提到的线程池不是defaultconsumer的一部分,而是connection的一部分,该部分在其通道defaultconsumer之间共享。它允许并行调用不同的使用者。请参阅指南的这一部分。

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

有一个很大的警告:不管线程池中有多少个线程,通过单个通道流动的传入消息都是串行处理的。这就是consumerworkservice的实现方式。

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

发布不使用connections的线程池中的线程,因此它们不会阻止使用者。

更多的细节,你可以查看这个帖子。

 类似资料:
  • 我有一个从Rabbit接收消息的应用程序。当收到一条消息时,它会对它进行处理,然后在完成时执行ACK。应用程序可以在一个固定的线程池中同时处理2个项目,有2个线程。Rabbit的QOS预取设置为2,因为我不想在一个时间框架内给应用提供超过它所能处理的内容。 现在,我的消费者的handleDelivery执行以下操作: 此时,您已经发现TestWrapperThread将调用作为最后一个操作。 根据

  • 我刚刚阅读了RabbitMQ的Java API文档,发现它非常丰富而且简单。关于如何为发布/消费设置一个简单的的示例非常容易遵循和理解。但这是一个非常简单/基本的示例,它给我留下了一个重要的问题:如何设置1+来向多个队列发布/消费? 假设我有一个RabbitMQ服务器,上面有3个队列:、和。因此,我们需要一个来发布/使用所有3个队列,或者更有可能有3个单独的,每个通道专用于一个队列。 在此基础上,

  • 我有简单的Spring启动RSocket服务 连接2个Spring服务很容易,但我的客户端应用程序没有Spring,我的客户端应该在RSocket java中 我很难理解如何将(路由,如Spring RocketRequest ester)消息发送到该特定通道。 客户端代码应为: 有可能订阅Spring频道吗?

  • 我了解了超分类器结构,但在通道MSP部分,我仍然有一些问题。通道MSP是本地MSP的结合,当客户端访问通道时,对等方如何验证客户端的身份?对等方需要访问通道MSP并自己检查客户端的身份吗?还是需要调用特定链码来验证?

  • 我的应用程序使用来自RabbitMQ的一些消息并对其进行处理。我有大约10个队列,每个队列最多有10个消费者(线程)。我有5次预回迁。我正在Heroku中使用CloudAMQP插件(RabbitMQ作为服务)运行安装程序。 我使用默认心跳和连接超时设置(60秒)运行。 我的java应用程序是一个使用sping-Rabbit库的Spring Boot应用程序。 版本: 问题是对于一个特定队列的消费者

  • 我在我产品环境中发现了一个问题。 我们在一个mq集群中有6个队列,我们有200个线程的线程池(实际上会更多,因为它会在一个独立的线程池中安排一些特殊任务)来处理来自上游的请求,当处理请求时,我会发布一个消息给rabbitmq Broker。 所以我有200个线程将消息发布到这6个队列。 对于每个队列,我将创建一个AMQP连接,对于每个线程,我有一个Channel的threadlocal,这样每个线