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

RabbitMQ multiple consumers across multiple queues - messages delayed from being processed

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

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

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

请注意,我们观察到当应用程序仅订阅单个队列时不会发生此问题,当涉及多个队列时它会成为问题。

使用以下示例可以很好地说明这一点:

是否可以在多个消费者订阅多个队列时,即使当前有消费者处于空闲状态,RabbitMQ 也可以分配一条消息由忙碌的消费者处理?

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

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

在 RMQ 文档 (https://www.rabbitmq.com/api-guide.html#consuming) 中,我们遇到了以下内容: “每个通道都有自己的调度线程。对于每个通道一个消费者的最常见用例,这意味着消费者不会阻止其他消费者。如果每个通道有多个消费者,请注意 long-running 消费者可能持有向该频道上的其他消费者发送回调。”

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