RabbitMQ (工作队列:Work Queues)

news2024/11/23 21:00:15

本章目录:

  • 什么是Work Queues
  • 模拟场景,使用Work Queues

 官网文档:RabbitMQ tutorial - Work Queues — RabbitMQ


一、何为Work Queues

我们先看下它的结构图

显然,它与入门案例相比只是多了几个消费者。

以下是官方文档说明

In the first tutorial we wrote programs to send and receive messages from a named queue. In this one we'll create a Work Queue that will be used to distribute time-consuming tasks among multiple workers.

The main idea behind Work Queues (aka: Task Queues) is to avoid doing a resource-intensive task immediately and having to wait for it to complete. Instead we schedule the task to be done later. We encapsulate a task as a message and send it to a queue. A worker process running in the background will pop the tasks and eventually execute the job. When you run many workers the tasks will be shared between them.

我大致总结了一下:

工作队列的的主要思想:避免立即执行资源密集型任务,且还需等待它们的完成。而是将任务安排在以后在再去执行,它将任务封装成一条条消息并且发布到队列。如果有多个工作者,它们将共享这些任务

也就是说,当任务量过多,或者任务量过重,我们可以采用Work Queues来提高处理任务的速度

二、模拟场景,使用Work Queues 

我们在消费者内使用time.sleep() 来模拟当前任务很“重",“工人”完成它需要耗时更久

先发布50条任务,每条任务休眠20ms,共计用时1s

接着,创建一个忙工人,和一个轻工人,合作去消费任务

我们预期是轻松工人多消费任务,忙工人少消费任务,能者多劳嘛~

但是结果如下:两个工人完全分享了这些任务,导致了忙的忙的非常忙,轻松的轻松的非常轻松,这显然是不合理的,我们应当是根据每个消费者的性能去分配适量任务。

关注后面的时间发现耗时了4秒左右。可是明明我们的easyWoker一秒就可以处理50条消息呀,怎么多加了一个消费者耗时更久了呢? 和官网说的:“当任务量过多,或者任务量过重,我们可以采用Work Queues来提高处理任务的速度”截然相反?

继续观察运行结果:轻工人(性能较高的消费者)确实在1S左右完成了分配给它的任务,但是我们将太多的任务分配给了“重工人”(性能较低的消费者),导致完成全部任务的总体耗时过长

为什么会对半分配任务而不考虑消费者性能呢?我们接着看看官方文档

 例如,在有两个工人的情况下,当所有的奇数消息都很重,偶数消息都很轻时,一个工人会一直忙碌,而另一个工人几乎不会做任何工作。好吧,RabbitMQ对此一无所知,并且仍然会均匀地发送消息。

之所以会发生这种情况,是因为RabbitMQ只是在消息进入队列时调度消息。它不考虑消费者未确认消息的数量。它只是盲目地将第n条消息发送给第n个消费者

RabbitMQ只是在消息进入队列的时候就把消息调度给了消费者,并不会考虑消费者未处理消息的数量

我们可以通过 设置prefetch: 1

告诉MQ在发消息之前,观察当前消费者是否已经完成了之前的任务,如果未完成,发送给下一个消费者

我在消费者的yml文件里进行配置 

 

设置后,重新发送消息,并观察消息处理结果

OK,现在可以很明显的看出《能者多劳了》 ,并且任务总耗时也在1S左右完成了

总结:

当任务量过多,或者任务量过重,我们可以采用Work Queues来提高处理任务的速度

通过设置 prefetch: 1,来根据消费者能力协调每个消费者的任务消费数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现

前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息,那么是否有办法加入一些先验信息来提升目标检测的精准度? 一种可行的思路是在目标检测的输出加入目标之间的关联信息,从而对目标进行干涉。 2017年8月,新加波管理大学…

Vue——插槽

目录 插槽内容与出口​ 渲染作用域​ 默认内容​ 具名插槽​ 动态插槽名​ 作用域插槽​ 具名作用域插槽​ 高级列表组件示例​ 无渲染组件​ 插槽内容与出口​ 在之前的章节中,我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props,…

微信小程序 | 基于ChatGPT实现电影推荐小程序

文章目录** 效果预览 **1、根据电影明星推荐2、根据兴趣标签推荐3、根据电影名推荐一、需求背景二、项目原理及架构2.1 实现原理(1)根据用户的兴趣标签(2)根据关联类似主题的题材(3)根据特定的电影明星2.2 …

IK集成ElasticSearch,IK分词器的下载及使用

IK集成ElasticSearch,IK分词器的下载及使用 下载ElasticSearch 8.7.0网址:Download Elasticsearch | Elastic 历史版本地址:Past Releases of Elastic Stack Software | Elastic 解压ElasticSearch 什么是IK分词器 分词∶即把一段中文或…

IO流基础

目录 1.FileOutPutStream字节输入流 1.1FileOutPutStream使用 1.1.1创建对象 FileOutPutStream fos new FileOutPutStream("路径或者File对象"); 1.1.2.写数据 调用write方法,参数是int类型,但传入文件中是asci…

【LeetCode: 剑指 Offer II 112. 最长递增路径 | 递归 | DFS | 深度优先遍历 | 记忆化缓存表】

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…

海康工业相机网口相机丢包问题解决方法

​1.1 系统环境设置 1.1.1 网卡设置 网卡推荐使 Intel 芯片的独立千兆网口,例如 intel I350、I210 等芯片组网卡 设置网卡巨型帧为选择 9KB 或 9014 字节 *不同网卡类型,网卡属性有差异,需灵活参考 设置网卡接收与传输缓存区到最大(intel 网卡一般为 2048,realtek 一般…

Program tuning - Druid和Linux配合优化数据库连接池配置

Program tuning - Druid和Linux配合优化数据库连接池配置配置步骤1. 添加依赖2. 添加配置3. 启动监控界面常见问题输入地址之后,浏览器直接打印html代码,而不是登录框刷新页面不能重新加载数据调优步骤1. 开始压测2. 监控线程池状态3. 查看服务器状态结论…

算法 贪心5 || 435. 无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435. 无重叠区间 和452. 用最少数量的箭引爆气球 思路是很相似的。本题按照左边排序或者按照右边排序都是可以的,最终目的都是为了让区间尽可能重叠。 1、按右边排序,排序完第一个元素的右边界一定是最小右边界。往下找第一个不与其重合的左边界&#x…

亚马逊云科技为全球的可持续发展进程做出贡献

可持续发展是一个涉及经济、环境和社会三个方面的复杂问题。经济发展必须在保护环境和社会公正的前提下进行,这样才能实现真正的可持续发展。为了实现这一目标,人们需要借助技术手段,更好地理解和解决环境和社会问题。 亚马逊云科技是全球领…

nssctf web入门(2)

目录 [SWPUCTF 2021 新生赛]easy_md5 [SWPUCTF 2021 新生赛]include [SWPUCTF 2021 新生赛]PseudoProtocols 这里通过nssctf的题单web安全入门来写,会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列,之后会一直出这个题单的解…

到了这个年纪,就应该阅读Spring源码了,源码阅读指南-编译加运行

文章目录到了那个年纪,就应该阅读Spring源码了😄第一步,clone😆第二步,使用idea打开项目😊gradle介绍(插叙手法)😃第三步,修改gradle的远程仓库地址&#x1f…

Day932.5个步骤,高效推动组件化架构重构 -系统重构实战

5个步骤,高效推动组件化架构重构 Hi,我是阿昌,今天学习记录都是关于5个步骤,高效推动组件化架构重构的内容。 项目的架构设计是一回事,代码落地又是另外一回事,很多架构设计最终都只是落在了 PPT 上。 一…

QT Graphics View坐标系转换

背景 在做绘图处理时,Scence作为场景,大小是无限的,而View作为一个观察镜头,观察范围是有限的。 那么有限的View观察无限的Scence区域,必然要选定一个观测锚点。 所以View具有一个centerOn(QPointF pos)函数&#xff…

Linux-初学者系列——篇幅1_文件管理命令(持续更新中)

Linux-初学者系列_篇幅1 文件管理命令-目录Linux-初学者系列_篇幅11.创建文件语法:示例:2.创建目录语法:示例:注意:常见错误:3.复制语法:示例:补充:4.移动语法&#xff1…

Vue|数据渲染

Vue 是如何将编译器中的代码转换为页面真实元素的?在Vue 中,自带了模板渲染,而模板的语法也非常简洁易懂。 精彩专栏持续更新↓↓↓ 微信小程序实战开发专栏 一. 数据渲染1.1 条件渲染v-ifv-show1.2 列表渲染v-for1.3 小结一. 数据渲染 1.1 条件渲染 vue条件渲染指…

3. 500 服务器异常 html

目录 1.效果图 2.code 1.效果图 2.code <!DOCTYPE html> <html><head><meta charset="utf-8"><title>500</title><style type="text/css">html,body {margin: 0;padding: 0;height: 100%;min-height: 450px;…

Git --- 常用命令、分支操作、团队协作机制

一、Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性 其性能优于 Subversion、…

多通道振弦传感器无线采集仪与参数配置工具连接

多通道振弦传感器无线采集仪与参数配置工具连接 VS101~VS432 设备配备了专门的参数配置工具 SETP 来完成设备工作参数的查看和修改工作。 连接前的准备工作 &#xff08; 1&#xff09;数据接口与计算机连接 使用标配的通讯线与计算机 RS232 接口连接。 若需基于手机网络发送数…

Java-异常机制

异常机制 正常情况下&#xff0c;程序按照我们希望的样子和步骤去执行&#xff0c;但是&#xff0c;代码就像人生&#xff0c;要是一帆风顺了&#xff0c;就要想想是不是哪里出事了。程序若是有报错还好&#xff0c;就怕没有报错。 实例 public class Test {public static vo…