RabbitMQ 队列消费行为

GaZ*_*GaZ 3 java apache-camel rabbitmq spring-boot

我们有一个 Spring Boot (2.1) 应用程序,它使用 Apache Camel (2.24) 从 RabbitMQ 服务器 (3.7.15) 消费。

应用程序似乎正在正确消费(一条消息,因为它们被放置在队列中),但在 RabbitMQ 监视器中,它显示为那些消息被“批量”消费(参见急剧下降然后平坦,即使我们在日志中看到应用程序正在处理消息)。

我们没有设置任何我能看到的“预取”行为。有人可以解释发生了什么吗?为什么队列数没有平滑减少?

rabbitmq 管理控制台

bur*_*rki 5

好吧,看起来默认的预取值是无限的。如果你想限制它,你必须明确地配置它。

我没有找到证实这种印象的官方来源,但至少有一篇文章确实如此:https : //www.cloudamqp.com/blog/2017-12-29-part1-rabbitmq-best-practice.html#prefetch

RabbitMQ 默认预取设置为客户端提供了无限的缓冲区,这意味着 RabbitMQ 默认会向任何看起来准备接受它们的消费者发送尽可能多的消息。

骆驼组件有一个选项prefetchEnabled是默认false。但是,当我查看方法中 Camel 组件的RabbitConsumer 类openChannel,这仅意味着消费者没有显式设置预取值

没有预取设置的消费者不一定是禁用预取的消费者,它是一个不关心预取的消费者(因此获得在其他地方定义的默认值)。

如果我没有忽略某些东西,骆驼选项prefetchEnabled就不是一个好名字。它应该被称为limitPrefetch。这也与RabbitMQ 文档匹配:

... 指定 basic.qos 方法以限制通道(或连接)上未确认消息的数量

结论:我怀疑如果您想要Camel 组件的预取限制您必须设置prefetchEnabled以及其他预取选项。否则没有限制(这基本上是有意义的,因为这可以为您提供最大吞吐量)。