SpringBoot实现RabbitMQ的WorkQueue(SpringAMQP 实现WorkQueue)

2024-03-28 09:20

本文主要是介绍SpringBoot实现RabbitMQ的WorkQueue(SpringAMQP 实现WorkQueue),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 前言
  • 2. 思路
  • 3. 消息发送
  • 4. 消息接收
    • 4.1 能者多劳
  • 总结


在这里插入图片描述

1. 前言

上一篇文章,实现了用 SpringBoot实现RabbitMQ的简单队列, 篇文章 操作 用SpringBoot实现RabbitMQWorkQueue(SpringAMQP 实现WorkQueue)

Work queues,也被称为(Task queues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息

在这里插入图片描述

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

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

注意:不一定是两个消费者。


2. 思路

代码实现思路:

1.在 publisher 服务中定义测试方法,产生50条消息(每隔20ms发送一条),发送到 test2024.simple.queue

2.在 consumer 服务中定义两个消息监听者,都监听simple.queue队列

3.消费者1处理50条消息(每隔20ms处理一条),消费者2处理50条消息(每隔100ms处理一条)


3. 消息发送

发送消息前先把 服务接收 的服务停止调.

循环 50 次, 每次休息 20 ms , 发送消息到指定队列

@Test
public void test01() throws InterruptedException {//  声明队列名称String queueName = "test2024.simple.queue";String message = "work_";for (int i = 1; i <= 50; i++) {// 发送消息rabbitTemplate.convertAndSend(queueName, message + i);Thread.sleep(20);}
}

发送完消息后, 我们看到消息整整齐齐的在 队列里躺着.

在这里插入图片描述


4. 消息接收

来连个监听器监听指定的队列, 但是两个监听队列的消费时间不一样.

@Component
public class SpringRabbitListener {//  监听指定队列,Spring只要接收到该队列的消息就会接收消息@RabbitListener(queues = "test2024.simple.queue")public void rabbitListener1(String message){System.out.println("1号接收器-接收到消息:" + message);;}//  监听指定队列,Spring只要接收到该队列的消息就会接收消息@RabbitListener(queues = "test2024.simple.queue")public void rabbitListener2(String message){System.out.println("2号接收器-接收到消息:" + message);;}}

此时启动消费者服务,然后再启动发送消息.

在这里插入图片描述

可以看到 1 号接收器很快消费了 25 条, 然后 2 号接收器缓慢的完成自己的… 1 号接收器没有给 2 号接收器帮忙. 那么咋生产环境中 ,就会造成服务闲置的情况下不能及时消费消息.

说明:阐述上述原因是因为队列平均分配给每个消费者,即使当前消费者没有消费完,队列也会将消息分配给消费者。然后消费者一个一个消息消费,即使消费很快的消费者,消费完毕,而消费很慢的消费者一直在消费。这样很不合理。应该是哪个消费者消费快应该多消费。哪个消费者消费慢应该少消费。

4.1 能者多劳

在 Spring 中有一个简单的配置叫预取 prefetch,可以解决这个问题。我们修改 consumer 服务的 application.yml 文件,添加配置:

 listener:simple:prefetch: 1   # 消费者每次最多只能预取一条消息,当消费完这条消息后,才能获取下一个消息,这样做的好处是消费能力强的消费者,处理的消息就会更多===》能者多劳

在这里插入图片描述

做了如上配置后,启动消费者服务,再次发送消息:

在这里插入图片描述

我们看到消费能力强的1号接收器完成了更多的工作,这样就达到了能者多劳.


总结

Work模型的使用:

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

在这里插入图片描述



这篇关于SpringBoot实现RabbitMQ的WorkQueue(SpringAMQP 实现WorkQueue)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855186

相关文章

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据