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

【RabbitMQ】WorkQueue

       📝个人主页:五敷有你      

 🔥系列专栏:MQ

⛺️稳中求进,晒太阳

Work Queues

Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息

当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。

此时就可以使用work 模型,多个消费者共同处理消息处理,消息处理的速度就能大大提高了。

消息发送

这次我们循环发送,模拟大量消息堆积现象。

在publisher服务中的SpringAmqpTest类中添加一个测试方法:

@Autowired
private RabbitTemplate rabbitTemplate;@Test
void testSendMessage2Queue() throws InterruptedException {String queueName1 = "work.queue";for(int i=0;i<50;i++){String msg = "Hello Work.Queue 编号:"+i;rabbitTemplate.convertAndSend(queueName1, msg);Thread.sleep(20);}}

消息接收

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

@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {System.out.println("消费者1收到了work.queue的消息:【" + msg +"】");Thread.sleep(5);
}
@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {System.err.println("消费者1收到了work.queue的消息:【" + msg +"】");Thread.sleep(50);
}

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

  • 消费者1 sleep了5毫秒,相当于每秒钟处理200个消息
  • 消费者2 sleep了50毫秒,相当于每秒处理20个消息

消息是平均分配给每个消费者,并没有考虑到消费者的处理能力。导致1个消费者空闲,另一个消费者忙的不可开交。没有充分利用每一个消费者的能力,最终消息处理的耗时远远超过了1秒。这样显然是有问题的。

能者多劳

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

再次测试,发现结果如下:.

可以发现,由于消费者1处理速度较快,所以处理了更多的消息;消费者2处理速度较慢,只处理了6条消息。而最终总的执行耗时也在1秒左右,大大提升。

正所谓能者多劳,这样充分利用了每一个消费者的处理能力,可以有效避免消息积压问题。

总结

Work模型的使用:

  • 多个消费者绑定到一个队列,同一条消息只会被一个消费者处理
  • 通过设置prefetch来控制消费者预取的消息数量
http://www.lryc.cn/news/313210.html

相关文章:

  • 国内免费好用 Chat GPT推荐
  • 基于springboot实现在线考试系统项目【项目源码+论文说明】
  • golang中go build 后读取配置文件
  • 为raspberrypi编译bpftrace调试工具
  • 分段线性化问题探析
  • 从零学算法2917
  • [HackMyVM] 靶场 Wave
  • 云渲染平台都开始涨价了?2024年性价比高的云渲染平台推荐
  • 搜索-BFS Meteor Shower S(流星雨)
  • RabbitMQ实战:Springboot集成RabbitMQ并验证五种消息模型
  • 配置与管理防火墙
  • 【SpringBoot】-- 实现本地文件/图片上传到服务器生成url地址
  • 计算机基础专升本笔记十四-计算机网络基础(一)
  • 【华为OD机试】转盘寿司【C卷|100分】
  • 使用Node JS获取WI-FI密码
  • 先缓存第二集抖音接入 ,最近加班猛,就分享简单的知识,如何使用:关于使用replace的用法正则表达式
  • 企微hook源码
  • vsphere虚拟机迁移是灰色如何解决
  • swift 闭包捕获列表
  • JavaWeb04-Request,Response
  • 使用 Docker 部署 Fiora 在线聊天室平台
  • Unity Samples和帧动画的问题
  • 几何工具的使用
  • sudo command not found
  • 1.【Labview白话系列】Labview数组精讲
  • ANTLR4规则解析生成器(三):遍历语法分析树
  • OpenCV实现目标追踪
  • 【剑指offer--C/C++】JZ6 从尾到头打印链表
  • 算法-买卖股票的最佳时机
  • 【大数据】Flink SQL 语法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints