当前位置: 首页 > news >正文

深入理解和应用RabbitMQ的Work Queues模型

文章目录

        • 1. 场景模拟
        • 2. 消息发送
        • 3. 消息接收
        • 4. 测试
        • 5. 能者多劳
        • 6. 总结

当你在处理消息时,可能会遇到这样的问题:消息的生产速度远远大于消费速度,导致消息堆积。这时候,Work Queues(工作队列)模型就能派上用场。简单来说,Work Queues 让多个消费者绑定到一个队列,共同消费队列中的消息,从而加快消息处理速度。

1. 场景模拟

我们来模拟一个这样的场景。首先,在控制台创建一个名为 work.queue 的队列。

2. 消息发送

我们通过循环发送大量消息来模拟消息堆积的现象。在 publisher 服务中的 SpringAmqpTest 类中添加一个测试方法:

@Test
public void testWorkQueue() throws InterruptedException {// 队列名称String queueName = "simple.queue";// 消息String message = "hello, message_";for (int i = 0; i < 50; i++) {// 发送消息,每20毫秒发送一次,相当于每秒发送50条消息rabbitTemplate.convertAndSend(queueName, message + i);Thread.sleep(20);}
}
3. 消息接收

为了模拟多个消费者绑定同一个队列,我们在 consumer 服务的 SpringRabbitListener 中添加两个新的方法:

@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {System.out.println("消费者1接收到消息:【" + msg + "】" + LocalTime.now());Thread.sleep(20);
}@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {System.err.println("消费者2........接收到消息:【" + msg + "】" + LocalTime.now());Thread.sleep(200);
}

注意到这两个消费者都设置了 Thread.sleep 来模拟任务耗时:

  • 消费者1:Thread.sleep(20),相当于每秒处理50个消息。
  • 消费者2:Thread.sleep(200),相当于每秒处理5个消息。
4. 测试

启动 ConsumerApplication 后,执行 publisher 服务中编写的发送测试方法 testWorkQueue。结果如下:

消费者1接收到消息:【hello, message_0】21:06:00.869555300
消费者2........接收到消息:【hello, message_1】21:06:00.884518
...
消费者1接收到消息:【hello, message_48】21:06:01.920702500
消费者2........接收到消息:【hello, message_49】21:06:05.723106700

可以看到,消费者1和消费者2各自消费了25条消息:

  • 消费者1快速完成了任务。
  • 消费者2则缓慢处理任务。

消息是平均分配给每个消费者的,并没有考虑到各个消费者的处理能力,导致一个消费者空闲,另一个忙碌。这显然是低效的。

5. 能者多劳

spring 中,可以通过简单配置解决这个问题。修改 consumer 服务的 application.yml 文件,添加如下配置:

spring:rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

再次测试,结果如下:

消费者1接收到消息:【hello, message_0】21:12:51.659664200
消费者2........接收到消息:【hello, message_1】21:12:51.680610
...
消费者2........接收到消息:【hello, message_49】21:12:52.746299900

这次,消费者1处理了更多的消息,消费者2则处理了较少的消息,总耗时在1秒左右,大大提升了效率。这充分利用了每一个消费者的处理能力,有效避免了消息积压问题。

6. 总结

Work Queues 模型的使用要点:

  • 多个消费者绑定到一个队列,同一条消息只会被一个消费者处理。
  • 通过设置 prefetch 来控制消费者预取的消息数量。

这样可以更高效地利用资源,提高消息处理速度。

相关文章:

深入理解和应用RabbitMQ的Work Queues模型

文章目录 1. 场景模拟2. 消息发送3. 消息接收4. 测试5. 能者多劳6. 总结 当你在处理消息时&#xff0c;可能会遇到这样的问题&#xff1a;消息的生产速度远远大于消费速度&#xff0c;导致消息堆积。这时候&#xff0c;Work Queues&#xff08;工作队列&#xff09;模型就能派上…...

嵌入式面试八股文(三)·野指针产生原因和解决方法、指针函数和函数指针的区别

目录 1. 野指针产生原因和解决方法 1.1 产生的原因 1.1.1 指针未能初始化 1.1.2 指针指向的内存被释放 1.1.3 指针指向的对象被重复释放 1.2 解决方法 1.2.1 初始化指针 1.2.2 指针空置 1.2.3 避免悬挂指针 2. 指针函数和函数指针的区别 2.1 定义不同 2…...

OpenCV 中 CV_8UC1,CV_32FC3,CV_32S等参数的含义

在OpenCV中&#xff0c;创建图像时需要指定图像的类型&#xff0c;这些类型通常通过常量来表示&#xff0c;例如 CV_8UC1、CV_32FC3、CV_32S 等。这些常量定义了图像的数据类型和通道数&#xff0c;具体含义如下&#xff1a; CV_8UC1&#xff1a; CV_8U 表示每个像素由一个8位无…...

v 3 + vite + ts 自适应布局(postcss-pxtorem)

1、 当pc端、移动端H5等项目中&#xff0c;需要根据当前浏览器窗口或屏幕尺寸&#xff0c;来自适应的改变页面内元素尺寸时&#xff0c;就可以借助下述插件和相关配置来实现。 2、适用范围&#xff1a;vue3 vite ts 步骤一&#xff1a;相关依赖下载下载相关依赖 npm inst…...

(MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2

文章简介 承接上一篇笔记,该份笔记是笔者深思熟虑后根据实战应用所总结出来的精华内容,该文章内容主要包括配置avc权限的使用场景以及其上下环节所需的准备。 使用场景 1.底层驱动有无配置好相应的串口 2.开启相应的selinux avc 权限 3.在framework层配置相应的 (config…...

Linux安全与高级应用(六)Linux Shell脚本编程的高级应用:条件测试与if语句的妙用

文章目录 Linux Shell脚本编程的高级应用&#xff1a;条件测试与if语句的妙用一、条件测试操作详解1. 字符串比较2. 整数比较3. 文件测试4. 逻辑测试 二、if语句的结构与应用1. 单分支结构2. 双分支结构3. 多分支结构 三、实际应用案例1. 需求描述2. 实现思路3. 代码实现4. 设置…...

升级MacOS(Mojave)后使用git问题

将MacOS升级到Mojave版本后&#xff0c;使用git工具时&#xff0c;出现如下错误提示&#xff1a; guochongxindeMacBook-Pro:study guochongxin$ git status . xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Librar…...

基于PFC和ECN搭建无损RoCE网络的工作流程分析

无损RoCE网络概念 RDMA&#xff08;Remote Direct Memory Access&#xff0c;远程直接内存访问&#xff09;是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。RDMA 将用户应用中的数据直接传入服务器的存储区&#xff0c;通过网络将数据从一个系统快速传输到远程系…...

射频功率放大器调测简略

射频功率放大器除了在设计时的难度外&#xff0c;其次就是调测阶段&#xff0c;设计时仿真可以通过不断更改仿真参数来达到理想状态&#xff0c;更关键的是不用提心吊胆的把烧器件&#xff0c;而处于调测阶段则很容易出现烧坏器件的情况&#xff0c;特别是功率大的射频功率放大…...

Linux使用docker搭建Redis 哨兵模式

1. Redis Sentinel 简介 Redis Sentinel 是 Redis 高可用解决方案的一部分。它提供了监控、通知和自动故障转移功能&#xff0c;确保 Redis 集群在主节点发生故障时仍然可以继续工作。以下是 Redis Sentinel 的主要功能和作用&#xff1a;监控&#xff1a; Sentinel 会不断检查…...

springboot给类进行赋初值的四种方式

目录 1. 使用Value和ConfigurationProperties2. 使用PropertySource创建Person.java写一个测试类 3. 使用ImportResourceStudent类创建beans.xml在主类中引入测试 其他心得 1. 使用Value和ConfigurationProperties 这里不加赘述了&#xff0c;前面我也发过&#xff0c;这里就放…...

Day32 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

语言 Java 1049. 最后一块石头的重量 II 最后一块石头的重量 II 题目 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 …...

linux 查看一个端口是否被占用

1 linux命令 要在Linux中查看一个端口是否被占用&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 运行以下命令来列出系统上所有正在监听的端口及其对应的进程&#xff1a; sudo netstat -tuln | grep LISTEN这将显示所有正在…...

【Git】5. 配置 Git

配置.gitignore – 忽略特殊⽂件 在⽇常开发中&#xff0c;我们有些⽂件不想或者不应该提交到远端&#xff0c;⽐如保存了数据库密码的配置⽂件&#xff0c;那怎么让 Git 知道呢&#xff1f; 在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件&#xff0c;然后把要忽略的…...

C语言:文件处理

文件处理 一、文件的类型&#xff08;一&#xff09;文本文件和二进制文件 &#xff08;二&#xff09;程序文件和数据文件数据文件按照二进制储存 二、文件的打开和关闭&#xff08;一&#xff09;文件指针&#xff08;二&#xff09;文件的打开和关闭1、fopen2、fclose &…...

SpringBoot MybatisPlus selectOne的坑

目录 一、问题 二、问题解决 三、其他方法 一、问题 selectOne在查询多条数据时会报错&#xff0c;查询语句并不会加 limit 1。 One record is expected, but the query result is multiple records。 二、问题解决 在QueryWrapper上添加如下&#xff1a; QueryWrapper&…...

Spring源码-ClassPathXmlApplicationContext的refresh()都做了什么?

AbstractApplicationContext的refresh方法 /*** 用给定的父类创建一个新的ClassPathXmlApplicationContext* Create a new ClassPathXmlApplicationContext with the given parent,* 从给定的XML文件加载定义* loading the definitions from the given XML files.* param confi…...

网站加密和混淆技术简介

我们在爬取网站的时候&#xff0c;会遇到一些需要分析接口或 URL 信息的情况&#xff0c;这时会有各种各样类似加密的情况 1. 某个网站的URL 带有一些看不懂的长串加密字符&#xff0c;要抓取就必须懂的这些参数是怎么构造的&#xff0c;否则我们连完整的 URL 都构造不出来&am…...

Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本

本文主要介绍 kafka kraft 搭建过程&#xff0c;主要用途是为了日志采集&#xff0c;所以搭建相对比较简单暴力&#xff0c;不过也可以作为一个参考供大家学习&#xff0c;主打一个能用管跑&#xff08;调优啊&#xff0c;参数解释啊&#xff0c;原理啊&#xff0c;太枯燥了&a…...

“Apple Intelligence”的“系统提示词”被曝光了

当 苹果的 Apple Intelligence 还未完全开放体验时&#xff0c;其提示词就已经曝光了。 苹果如何指挥 AI 干活&#xff0c;这次被泄露的非常彻底。我们就拿邮件来说&#xff0c;借助 AI&#xff0c;收发及回复邮件变得非常简单&#xff0c;但背后的逻辑是内置提示词在拿捏。 比…...

Qwen3-VL-8B-Instruct-GGUF实战:上传图片秒懂内容,智能问答体验分享

Qwen3-VL-8B-Instruct-GGUF实战&#xff1a;上传图片秒懂内容&#xff0c;智能问答体验分享 1. 模型概述与核心优势 Qwen3-VL-8B-Instruct-GGUF是阿里通义最新推出的中量级多模态模型&#xff0c;它最大的特点可以用一句话概括&#xff1a;用8B参数实现72B级别的视觉语言理解…...

SEO 搜索引擎公司如何提高网站的流量

SEO 搜索引擎公司如何提高网站的流量 在当今互联网时代&#xff0c;网站的流量直接影响着企业的品牌知名度和市场竞争力。对于许多企业来说&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;成为了提升网站流量的关键途径。SEO 搜索引擎公司究竟如何有效提高网站的流量呢&…...

新手程序员福音:coze-loop智能优化代码,附详细修改说明

新手程序员福音&#xff1a;coze-loop智能优化代码&#xff0c;附详细修改说明 1. 为什么新手程序员需要代码优化工具 刚入行的程序员常常面临一个困境&#xff1a;写出的代码虽然能运行&#xff0c;但质量参差不齐。要么效率低下&#xff0c;要么难以维护&#xff0c;要么存…...

Google Authenticator PHP集成避坑指南:从扫码到验证的完整流程与常见错误解决

Google Authenticator PHP集成深度排障手册&#xff1a;从原理到实战的30个关键细节 当你按照教程一步步完成Google Authenticator的PHP集成&#xff0c;却在最后一步验证失败时&#xff0c;那种挫败感我深有体会。三年前我第一次在金融项目中实现动态口令认证&#xff0c;连续…...

开发环境搭建新选择:Python3.9镜像简化部署流程

开发环境搭建新选择&#xff1a;Python3.9镜像简化部署流程 你是不是也遇到过这样的场景&#xff1a;新接手一个项目&#xff0c;光是配环境就花了大半天&#xff0c;各种依赖冲突、版本不兼容&#xff0c;代码还没开始写&#xff0c;心态先崩了一半。或者&#xff0c;好不容易…...

PX4飞控自定义Mavlink消息:实现UART传感器数据在QGC地面站的可视化

1. 为什么需要自定义Mavlink消息 在无人机开发中&#xff0c;我们经常需要将各种传感器数据实时传输到地面站进行监控和分析。PX4飞控虽然内置了丰富的标准Mavlink消息&#xff0c;但当我们接入一些特殊传感器时&#xff0c;标准消息往往无法满足需求。比如你想通过UART串口接入…...

科研不秃头!谁还不知道这个零代码生信神器

各位深陷生信泥潭的科研宝子们&#xff0c;集合啦&#xff01;&#x1f4e2;你是否也经历过这样的绝望&#xff1a;❌ 导师甩来一组单细胞数据&#xff0c;你却连 Linux 怎么登录都不知道&#xff1f;❌ 好不容易装好了 R 语言&#xff0c;结果包版本冲突报错到怀疑人生&#x…...

Fujitsu空调本地化控制:ESP32协议逆向与硬件隔离方案

1. FujitsuAC 开源库深度解析&#xff1a;面向嵌入式工程师的 Fujitsu 空调本地化控制方案1.1 项目定位与工程价值FujitsuAC 是一个专为 ESP32 平台设计的开源固件库&#xff0c;其核心目标是完全替代 Fujitsu 原厂 UTY-TFSXW1 / UTY-TFSXF3 WiFi 通信模块&#xff0c;实现对 F…...

保姆级教程:在Win10上用VMware给Ubuntu虚拟机配置共享文件夹(含重启失效解决方案)

VMware虚拟机共享文件夹配置全指南&#xff1a;从基础配置到疑难解决 在Windows 10主机上使用VMware运行Ubuntu虚拟机进行开发时&#xff0c;共享文件夹功能是提高工作效率的关键。本文将详细介绍如何从零开始配置共享文件夹&#xff0c;并解决常见的"安装按钮灰色"、…...

AI率85%的论文,这款工具降完后我直接去答辩了

答辩前5天&#xff0c;知网AIGC检测报告出来了&#xff1a;AI率85%。 我是那种遇到问题喜欢先搜索再行动的人&#xff0c;所以花了两个小时看了很多经验帖。最终决策&#xff1a;不手改&#xff0c;直接上比话降AI。 结果&#xff1a;11%&#xff0c;答辩前3天处理完&#xf…...