根据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. [转帖]编译安装goofys挂载Scaleway免费75G对象存储

    日常•2022年5月29日   goofys编译 goofys是一个开源的使用Go编写的s3存储桶挂载工具,主打高性能.由于使用Go编写,没有用到什么特别的依赖,自己编译也很容易.截止2022.5.2 ...

  2. [转帖]java获取到heapdump文件后,如何快速分析?

    https://www.jianshu.com/p/aaf56385766d   简介 在之前的OOM问题复盘之后,本周,又一Java服务出现了内存问题,这次问题不严重,只会触发堆内存占用高报警,没有 ...

  3. [转帖]关于 AREX

    https://arextest.github.io/website/zh-Hans/docs/intro/ AREX 介绍​ 背景​ 对于一个初上线的简单服务,只需通过常规的自动化测试加上人工即可解 ...

  4. [转帖]window10下如何安装fio

    1.fio下载地址(实测有效): https://github.com/axboe/fio/releaseshttps://github.com/axboe/fio/releases 其他的地址如​​ ...

  5. [转帖]Linux-文本处理三剑客grep详解

    https://developer.aliyun.com/article/885611?spm=a2c6h.24874632.expert-profile.311.7c46cfe9h5DxWK 简介: ...

  6. 三十分钟入门基础Go(Java小子版)

    作者:京东科技 韩国凯 前言 Go语言定义 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态.强类型.编 ...

  7. 【发现一个问题】macos m2 下无法使用 x86_64-linux-musl-gcc 链接含有 avx512 指令的 c 代码

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 一开始是使用 golang 中的 cgo 来编译: env ...

  8. jenkins 安装与构建过程中的系列问题

    一.插件安装遇到的依赖问题 插件安装分为在线安装和离线安装 1.在线安装 搜索要安装的插件,然后进行安装即可 2.离线安装hpi文件 使用该方法安装插件每次只能安装一个插件,且如果插件之间存在依赖性则 ...

  9. [LeetCode刷题记录]39 组合总和

    题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的数字可以无限制 ...

  10. C/C++ 文件与指针操作笔记

    创建临时文件 #include <stdio.h> int main(int argc, char *argv[]) { FILE *temp; char c; if ((temp = t ...