【RabbitMQ】WorkQueue

news/2024/7/24 11:40:19 标签: java, 开发语言, rabbitmq

       📝个人主页:五敷有你      

 🔥系列专栏:MQ

⛺️稳中求进,晒太阳

Work Queues

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

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

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

消息发送

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

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

java">@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个新的方法

java">@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秒。这样显然是有问题的。

能者多劳

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

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

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

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

总结

Work模型的使用:

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

http://www.niftyadmin.cn/n/5413466.html

相关文章

『大模型笔记』LLM框架(LangChain、LlamaIndex、Haystack、Hugging Face)哪一个是满足您特定需求的最佳选择?

LLM框架(LangChain、LlamaIndex、Haystack、Hugging Face)哪一个是满足您特定需求的最佳选择&#xff1f; 文章目录 1. LangChain1.1. 优势1.2. 劣势1.1. 理想用例 2. LlamaIndex2.1. 优势2.2. 劣势2.3. 理想用例 3. Haystack3.1. 优势3.2. 劣势3.3. 理想用例 4. Hugging Face…

谷歌开源的LLM大模型 Gemma 简介

相关链接&#xff1a; Hugging face模型下载地址&#xff1a;https://huggingface.co/google/gemma-7bGithub地址&#xff1a;https://github.com/google/gemma_pytorch论文地址&#xff1a;https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf官方博客&…

企业微信HOOK接口Dll调用(4.1.16.6002版本)

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口可…

一次gitlab 502故障解决过程

通过top,发现prometheus进程占用CPU接近100%&#xff0c;这肯定有点异常。gitlab-ctl tail prometheus 发现有报错的情况&#xff0c;提示空间不足。暂时不管空间的问题。 2024-03-07_05:48:09.01515 ts2024-03-07T05:48:09.014Z callermain.go:1116 levelerror err"open…

springboot 实现登录注册

文章目录 前言登录功能前台后台逻辑 退出登录前台 使用jwt在后端进行鉴权引入依赖给后台接口加上统一的前缀/api&#xff0c;开始Jwt配置 注册功能前台后台 前言 本文将整合简单的登录注册功能。 登录功能 前台 构造前台页面 <template><div><div style&qu…

用Django 写学习笔记程序第三章.1设置项目样式

文章目录 往期回顾设置项目的样式应用程序 jdango-bootstap3bootstrap 下载将下载好的 bootstrap 加入到项目为使用交互元素在bootstrap中加入jQuery 修改 base.html定义 HTML 头部定义导航栏定义页面的主要部分 用 jumbotron 设置主页的样式设置登录页面的样式设置 new_topic …

Redis info - 内存

redis-cli | grep mem used_memory:263302512 used_memory_human:251.10M used_memory_rss:299659264 used_memory_peak:1288775696 used_memory_peak_human:1.20G used_memory_lua:36864 mem_fragmentation_ratio:1.14 mem_allocator:jemalloc-3.6.0通过使用 redis-cli 连接到…

【深入理解LRU Cache】:缓存算法的经典之作

目录 一、什么是LRU Cache&#xff1f; 二、LRU Cache的实现 1.JDK中类似LRUCahe的数据结构LinkedHashMap 2.自己实现双向链表 三、LRU Cache的OJ 一、什么是LRU Cache&#xff1f; LRU Cache&#xff08;Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0…