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

RabbitMQ跨多个队列的多个使用者-消息被延迟处理

养星汉
2023-03-14

我们最近遇到了由RabbitMQ支持的应用程序的意外行为。RabbitMQ版本为3.6.12,我们使用的是.NET客户端5.0.1

应用程序订阅了两个队列,一个用于命令,另一个用于事件--我们还使用手动确认。我们的应用程序配置为有7个消费者。每个通道都有自己的通道(IModel),每个通道都有自己的EventingBasicConsumer,当EventingBasicConsumer.Received被激发时,我们将处理消息。

我们的应用程序必须尽可能在消息被路由到队列时处理它们,并且到目前为止我们还没有遇到过问题。然而,最近我们看到,当我们正在处理的一个消息需要很长时间才能完成时,它会在另一个消息要处理时延迟,尽管有许多可用的消费者(6)不忙。

注我们注意到,当应用程序只订阅一个队列时,这个问题不会发生,当涉及多个队列时,这个问题就变成了一个问题。

下面的示例最好地说明了这一点:

>

  • 我们有一个简单的消费应用程序,它订阅两个队列,一个用于命令,一个用于事件。这个应用程序有7个消费者,每个消费者都有自己的通道和EventingBasicConsumer我们启动一个简单的发布应用程序,每隔一秒发布20条消息。每条消息都是一个事件,因此会发布到事件队列中,但第5条和第10条消息除外,这两条消息是命令并发送到命令队列中。请注意,每个事件的处理都没有延迟,而命令需要30秒

    因此,在我们看来,通道的分配是每个队列独立完成的--这意味着,如果某些消息需要很长时间来处理,您可能会延迟执行

    有没有可能,当多个消费者正在订阅多个队列时,RabbitMQ可以分配一条消息给一个忙的消费者处理,即使有当前空闲的消费者?

    是否有任何文档解释RabbitMQ算法,该算法从一个消费者集合中选择哪些消费者eventingbasicconsumer.received fire?

  • 共有1个答案

    蔺敏达
    2023-03-14

    我们已经解决了这个问题。

    在RMQ文档(https://www.rabbitmq.com/api-guide.html#consument)中,我们遇到了以下内容:“每个通道都有自己的分派线程。对于每个通道一个使用者的最常见用例,这意味着使用者不会阻止其他使用者。如果每个通道有多个使用者,请注意,长时间运行的使用者可能会阻止对该通道上其他使用者的回调分派。”

    在我们的代码中,每个通道有2个消费者,这意味着消费者可以阻止其他消费者。我们改为每个渠道有一个消费者,这就解决了这个问题。

     类似资料:
    • 我刚刚开始使用RabbitMQ和AMQP。 我有一个消息队列 我有多个消费者,我想用相同的消息做不同的事情。 RabbitMQ的大部分文档似乎都集中在循环(round-robin)上,即单个消息由单个消费者使用,负载在每个消费者之间分散。这的确是我目击的行为。 例如:生产者只有一个队列,每2秒发送一次消息: 这里有一个消费者: 如果我启动消费者两次,我可以看到每个消费者都在以循环行为消费交替消息。

    • 问题内容: 我一般只是开始使用RabbitMQ和AMQP。 我有一条消息队列 我有多个消费者,我想用 同一条消息 做不同的事情。 RabbitMQ的大多数文档似乎都集中在循环上,即单个消息由单个使用者使用,而负载则分散在每个使用者之间。我确实是这种行为。 例如:生产者只有一个队列,每2秒发送一次消息: 这是一个消费者: 如果我启动使用者两次,则 可以看到每个使用者都以循环方式使用替代消息。 例如,

    • ActiveMQ消息组是跨多个使用者进行负载平衡的一个非常好的特性。简而言之:消息流根据消息中嵌入的组标识符()在单个队列的多个使用者之间进行分区。(因此,使用者1将获得的所有消息,使用者2将获得的所有消息,依此类推) 现在,假设您有两个队列:和,并假设在流经这两个队列的消息中使用一致的S分类法。代理为on queue选择的使用者是否与代理为on queue选择的连接相同? 但是,我们能模拟这种行

    • 有没有一种方法可以限制RabbitMQ队列只将固定数量的消息从队列发送给使用者? 关于这一问题的更多背景资料: 为什么一次只处理2条消息?:Q2消息正在执行web服务调用,而web服务endpoint(第三方)只能同时服务2个消息。 我们不能使用并发吗?:如果我们使用ListenerContainer(Spring AMQP),则容器是每个消费者的。我们可以限制一个消费者一次可以获取多少消息,但是

    • 我有一个关于RabbitMQ队列的问题。我想在一个队列上发送两种类型的消息。 我知道,我可以创建两个不同的队列,并使用路由键将不同的消息发送到不同的队列。 但是我希望在一个队列上有两个消费者,并以某种方式将消费者与消息类型绑定。它是通过兔子队列驱动的事件,当客户端和核心是发布者和消费者时。 有可能吗?或者我应该使用不同的队列吗? 数据交换

    • 我是新手RabbitMQ java客户端。我的问题:我创建了10个consumer并将它们添加到队列中。每个消费者使用10秒来处理我的流程。我检查了Rabbit的页面,我看到我的队列有4000条消息没有发送到客户端。我检查了日志客户端,结果是为一个消费者获取一条消息,10秒后,我为一个消费者获取一条消息,依此类推…我想要得到10个消息为所有消费者在当时(10个消息-10消费者过程在当时)请帮助我,