RabbitMQ队列消费行为

3
我们有一个Spring Boot(2.1)应用程序,使用Apache Camel(2.24)从RabbitMQ服务器(3.7.15)消费。
应用程序似乎正在正确消费(逐个消息),但在RabbitMQ监视器中,这些消息似乎是批量消费的(请参见突然下降的图形然后保持平稳,尽管我们在日志中看到应用程序正在处理消息)。
我没有看到任何我们设置的“预取”行为。有人能解释一下发生了什么吗?为什么队列计数不平稳地减少?

rabbitmq management console

2个回答

5

简而言之,它看起来像是默认预取值为无限制。如果你想要限制它,你必须显式地对其进行配置。

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

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

Camel组件有一个选项 prefetchEnabled,默认情况下为 false。然而,当我查看 Camel 组件中的RabbitConsumeropenChannel方法时,这仅意味着消费者不会显式设置预取值。

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

如果我没有忽略什么,Camel选项prefetchEnabled没有一个好的名称。它应该被称为limitPrefetch。这也符合RabbitMQ文档的描述:

...指定了 basic.qos 方法,使得 可以限制 频道(或连接)上未确认消息的数量

结论:我怀疑,如果你想要使用 Camel 组件的预取限制,则必须同时设置 prefetchEnabled 和其他预取选项。否则就没有限制(这基本上是有意义的,因为这会给你最大的吞吐量)。


谢谢Burki,但即使默认的“预取量”是无限的,预取行为本身是否被禁用呢? - GaZ
至少在我们的使用中,根据org.apache.camel.component.rabbitmq.springboot.RabbitMQComponentConfiguration#prefetchEnabled来看,它似乎是这样的。 - GaZ
1
我扩展了我的答案。prefetchEnabled = false 可能会产生误导。 - burki

0

from("rabbitmq://localhost:5672/delete.Tenant?queue=tenant&declare=false&autoAck=false&threadPoolSize=20&concurrentConsumers=20&prefetchEnabled=true&prefetchCount=100")


2
你想要传达什么? - Lalit Mehra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接