根据RabbitMQ官方文档描述,可以通过“预取数量”来限制未被确认的消息个数,本质上这也是一种对消费者进行流控的方法。

详见:https://www.rabbitmq.com/consumer-prefetch.html#independent-consumers 。

由RabbitMQ的机制可知,当多个消费者订阅同一个Queue时,这时Queue中的消息会被平均分摊给多个消费者进行处理,因此一定要对该参数设置合理的值。

需要针对具体的应用场景,适当增大或减小该参数值(默认值为0表示不限制),以提高消费者吞吐量和充分利用资源,参考策略如下:

1.针对订单类消息,因为处理耗时很短,可以适当增大该参数值,这样Broker在一次网络通信中会尽可能多地推送一些数据给消费者,以提高消费吞吐量;

2.对于依赖CPU计算型的耗时任务,该参数值则不能设置过大,否则会出现消息被分配后因为耗时等待一直无法确认而产生堆积,此时即使有别的消费者已经空闲也无法再被分配这些已经堆积的消息,导致资源浪费。

RabbitMQ客户端提供了相应设置方法:

// 设置预取消息数量,默认值为0,不限流
channel.basicQos(10);

在Spring Boot框架中可以直接通过如下配置参数进行设定:

// listener类型为direct,设置预取消息数量为10,默认值为250(在AbstractMessageListenerContainer中定义的常量:DEFAULT_PREFETCH_COUNT)
spring.rabbitmq.listener.direct.prefetch=10

落实到本项目中,线上曾出现过这样的现象:K8S管理的Docker集群中,当RabbitMQ中出现消息堆积时,却只有1个Docker实例的负载持续很高,而其他Docker实例都非常闲。这显然不符合预期,应该大家都很忙才对。

经排查分析后得知:本项目的特点是每一个任务消息都是CPU耗时型,如果消费者每次都获取到多个任务消息到本地,那么就会出现即使其他消费者已经空闲了也无法为自己分担任务的情形。

解决办法:限制每次给每个消费者只分派一个任务消息(prefetch=1),这样如果某个消费者在处理任务时被“卡住”了,则不再分配新的任务给它,而是把剩下的任务消息分配给那些已经空闲的消费者执行。

关于RabbitMQ消费者预取消息数量参数的合理设置的更多相关文章

  1. RabbitMQ 消费者的消息确认机制

    消息确认的几点说明: 1. Basic.Ack 发回给 RabbitMQ 以告知,可以将相应 message 从 RabbitMQ 的消息缓存中移除.2. Basic.Ack 未被 consumer ...

  2. RabbitMQ~消费者实时与消息服务器保持通话

    这个文章主要介绍简单的消费者的实现,rabbitMQ实现的消费者可以对消息服务器进行实时监听,当有消息(生产者把消息推到服务器上之后),消费者可以自动去消费它,这通常是开启一个进程去维护这个对话,它与 ...

  3. supervisor安装以及监控管理rabbitmq消费者进程

    简介:Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 1.安装 apt-get install ...

  4. RabbitMQ消费者消息权重,

    有的消费者处理速度快,有的消费者处理速度慢,我们想给处理快的多发消息,处理慢的少发消息, 怎么办呢?按照之前的轮询模式,肯定不行的,这里可以检测消息数量,如果消费者正在处理就不给他发 .... def ...

  5. SpringBoot整合RabbitMQ,实现消息发送和消费以及多个消费者的情况

    下载安装Erlang和RabbitMQ Erlang和RabbitMQ:https://www.cnblogs.com/theRhyme/p/10069611.html AMQP协议 https:// ...

  6. rabbitmq消费者“无故消失”

    hi,all   导读:9月1号17:12左右,发现影子队列存在大量“unacked”(收到了消息,但是还没有手动确认消息)的消息,一段时间后“unacked”的数量没有减少,但是观察消费者端的日志, ...

  7. rabbitmq监控之消息确认ack

    rabbitmq springboot ack 监控 一.测试环境 二.启动测试 一直以来,学习rabbitmq都是跟着各种各样的教程.博客.视频和文档,撸起袖子就是干!!!最后,也成功了. 当然,成 ...

  8. 2.RabbitMQ 的可靠性消息的发送

      本篇包含 1. RabbitMQ 的可靠性消息的发送 2. RabbitMQ 集群的原理与高可用架构的搭建 3. RabbitMQ 的实践经验   上篇包含 1.MQ 的本质,MQ 的作用 2.R ...

  9. rabbitmq五种消息模型整理

    目录 0. 配置项目 1. 基本消息模型 1.1 生产者发送消息 1.2 消费者获取消息(自动ACK) 1.3 消息确认机制(ACK) 1.4 消费者获取消息(手动ACK) 1.5 自动ACK存在的问 ...

  10. RabbitMQ高级之消息限流与延时队列

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第五弹. 上篇本来打算讲述RabbitMQ的一些高级用法: 如何保证消息的可靠性? 消息队列如何进行限流? ...

随机推荐

  1. [转帖]谨慎调整内核参数:vm.min_free_kbytes

    https://www.cnblogs.com/muahao/p/8082997.html 内核参数:内存相关 内存管理从三个层次管理内存,分别是node, zone ,page; 64位的x86物理 ...

  2. [转帖]我们为什么放弃 MongoDB 和 MySQL,选择 TiDB

    https://zhuanlan.zhihu.com/p/164706527 写在前面的话 技术选型是由技术方向和业务场景 trade-off 决定的,脱离业务场景来说技术选型是没有任何意义的,所以本 ...

  3. 【转帖】Linux查看二进制文件:一招制敌(linux二进制查看文件)

    https://www.dbs724.com/146055.html 一招制敌:学会Linux查看二进制文件 在Linux操作系统中,二进制文件是一种常见的文件类型.如果你想深入了解一个二进制文件,可 ...

  4. ES客户端spring-boot-starter-data-elasticsearch

    ES客户端分类 Es-Server提供RESTFul-Api,客户端通过发起http请求,调用api实现索引库的管理,数据的交换,server端状态的监控...... 官方java客户端: <d ...

  5. Ant Design Vue中TreeSelect详解

    <template> <a-tree-select v-model:value="value" style="width: 320px" :t ...

  6. 初试高云FPGA

    前言 之前一直眼馋Sipeed的Tang系列,正好遇到有工程需要高速控制并行总线,就买了NANO 9K和Primer 20K试试水 买回来先拆的贵的20k,结果发现Sipeed设计师有奇怪的脑回路: ...

  7. 解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题

    解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题 LLM(Large Language Model)通常拥有大量的先验知识,使得其在许多自然语言处理任务上都有着不错的性能 ...

  8. 2.1 C/C++ 使用数组与指针

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  9. 5.14 汇编语言:仿写Switch选择结构

    选择结构,也称为switch语句,是计算机编程中的一种控制结构,用于根据表达式的值选择不同的执行路径.它允许程序根据表达式的值来决定执行哪个代码块,从而实现多分支选择逻辑.switch语句由一个表达式 ...

  10. 使用Fiddler复制并转发http响应数据

    1.安装Fiddler 略 2.编辑FiddlerScript,增加拦截判断 Goto OnBeforeResponse,跳转到指定函数,在函数中添加拦截某些http代码,如下. if (oSessi ...