我们最近经历了由RabbitMQ驱动的应用程序的意外行为。RabbitMQ版本为3.6.12,我们使用的是.NET客户端5.0.1
应用程序订阅两个队列,一个用于命令,另一个用于事件--我们还使用手动确认。我们的应用程序被配置为有7个使用者。每个通道都有自己的通道(IModel),每个通道都有自己的EventingBasicConsumer,当EventingBasicConsumer.Received被触发时,我们最终会处理消息。
当消息被路由到队列时,我们的应用程序必须处理尽可能接近的消息,到目前为止,我们还没有遇到问题。然而,最近我们已经看到,当我们正在处理的一条消息需要很长时间才能完成时,当另一条消息被处理时,它会延迟,尽管有许多可用的用户(6)并不忙。
注意,当应用程序只订阅单个队列时,这个问题不会发生,当涉及多个队列时,它就会成为一个问题。
最好用以下示例说明这一点:

当多个消费者订阅多个队列时,RabbitMQ是否可以分配一条消息,以便在当前空闲的消费者的情况下由繁忙的使用者处理?
是否有任何文档解释了RabbitMQ算法,该算法从消费者集合中选择哪些消费者EventingBasicConsumer.received?
发布于 2019-05-31 11:10:51
我们已经解决了这个问题。
在RMQ文档(https://www.rabbitmq.com/api-guide.html#consuming)中,我们发现:“每个通道都有自己的调度线程。对于每个通道中最常见的一个消费者用例,这意味着每个通道的消费者不会支持其他消费者。如果每个通道有多个消费者,那么长期运行的使用者可能会延迟向该通道上的其他消费者分派回调。”
在我们的代码中,每个通道有两个消费者,这意味着消费者可以支持其他消费者。我们改变了每个频道有一个消费者,这解决了这个问题。
https://stackoverflow.com/questions/56380295
复制相似问题