java - RabbitMQ队列消费行为

标签 java spring-boot rabbitmq apache-camel

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

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

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

rabbitmq management console

最佳答案

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

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

RabbitMQ default prefetch setting gives clients an unlimited buffer, meaning that RabbitMQ by default send as many messages as it can to any consumer that looks ready to accept them.

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

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

如果我没有忽略某些事情,Camel 选项 prefetchEnabled 的名称并不好。它应该被称为 limitPrefetch。这也将与 RabbitMQ docs 匹配:

... specifies the basic.qos method to make it possible to limit the number of unacknowledged messages on a channel (or connection)

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

关于java - RabbitMQ队列消费行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57622069/

相关文章:

python - RabbitMQ:Celery 有什么 Pika 没有的?

java - Spring AMQP : CorrelationId changes between moment of sending and receiving a message

java - 在导出的 JAR 中进行编码

spring - 使用 Spring Boot 自定义 OpenApi 文档

java - 使用 jar 中的@entity 时,Spring Data Jpa Repository 不工作

java - 重新连接 spring amqp

Java 的 int read(byte[] data) 返回的字节数比预期多

java - Spring DevTools 未包含在 spring-boot-maven-plugin 打包的 fat jar 中

java 比较两个 Pattern 对象

spring-boot - 如何在Jboss或Tomcat上部署Spring Cloud Gateway 2.1?