【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

🎉🎉欢迎光临,终于等到你啦🎉🎉
🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀
🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 🚀
本专栏带你从Spring入门到入魔
这是苏泽的个人主页可以看到我其他的内容哦👇👇
努力的苏泽
http://suzee.blog.csdn.net/
在认识消息队列之前 我想有必要说明什么是异步处理
今天是女神节 现在我们的坤坤 很希望约他的女神出来

当然结果不尽人意
于是坤坤转念一想 天下女神千千万 何必单恋一枝花? 他提出了这样一个理论“只要舔的够多 够快 总能成功的” 于是他转换策略 他决定在列表中循环
问完一个女神 再问候下一个

这 就是同步处理
但他发现效率太低了 等他问到第三个的时候 隔壁老王已经把小美越走了 于是坤坤为了解决这个问题 想到了一个很好的办法 那就是异步通讯

异步通讯
异步同学 顾名思义 “异”就是不同 不同的步骤去执行 就不是一个线上的 他不必等待上一位女神给他回复 或者他不必完成上一次的任务(可以理解为群发) 就能够直接执行下一步 这 就是异步处理(异步通讯)
但是 要怎么样实现这个模型? 就引入到了这里的主题 消息队列
消息队列 --RabbitMQ
RabbitMQ是一个消息队列中间件,用于实现应用程序的异步和解耦,同时也能起到消息缓冲和消息分发的作用。它是基于AMQP(高级消息队列协议)的一种消息中间件,最初起源于金融系统,用于在分布式系统中存储和转发消息。RabbitMQ具有高可用性、高性能和灵活性等特点,因此在互联网公司和分布式系统中得到广泛应用

我们来解析其架构 就会发现其实这是一个很简单的东西
无非就是 发布(也可以说是生产)和消费
生产者:
生产者是消息队列中的消息发送方。它负责创建并发送消息到消息队列中,供消费者进行消费。生产者通常与特定的业务逻辑相关联,根据业务需求生成消息并将其发送到消息队列。生产者将消息发送到特定的队列或主题,然后消息队列会将消息传递给一个或多个消费者进行处理。
生产者的主要职责包括:
- 创建消息并设置相关的属性(如消息内容、优先级、过期时间等)。
- 将消息发送到消息队列中。
- 处理发送消息过程中可能出现的异常情况。
消费者:
消费者是消息队列中的消息接收方。它负责从消息队列中获取消息并进行处理。消费者通常与特定的业务逻辑相关联,负责处理接收到的消息,执行相应的操作,可能是业务逻辑的处理、数据存储、日志记录等。
消费者的主要职责包括:
- 从消息队列中获取消息。
- 处理接收到的消息,执行相应的操作。
- 确认消息的消费状态(如消息确认、消息拒绝、消息重试等)。
- 处理消费消息过程中可能出现的异常情况。
生产者和消费者的协作可以实现解耦和异步通信的优势。生产者可以独立于消费者的处理速度和状态,将消息发送到消息队列中,而消费者可以根据自己的处理能力和需求从消息队列中获取并处理消息。这种解耦和异步通信的方式可以提高系统的可伸缩性、可靠性和灵活性。

深入原理

他由下面四个部分组成:
-
生产者(Producer):
生产者负责创建并发送消息到RabbitMQ的交换器。生产者将消息发布到特定的交换器,并可以指定消息的路由键(Routing Key)。生产者可以根据业务需求生成消息,并选择将消息发送到特定的交换器中。 -
交换器(Exchange):
交换器是消息的分发中心,它接收来自生产者的消息,并根据消息的路由键将消息路由到一个或多个绑定的队列中。交换器根据事先定义的规则(Exchange Type)来决定如何路由消息。RabbitMQ提供了几种常见的交换器类型,包括直连交换器(Direct Exchange)、主题交换器(Topic Exchange)、广播交换器(Fanout Exchange)和首部交换器(Headers Exchange)。 -
队列(Queue):
队列是消息的存储和传递载体。它是消息的终点,消费者通过订阅队列来接收消息。每个消息都被发送到一个特定的队列中,消费者从队列中获取消息并进行处理。队列具有先进先出的特性,保证了消息的顺序性。 -
消费者(Consumer):
消费者从队列中获取消息并进行处理。消费者可以根据自身的需求订阅一个或多个队列,以接收相应的消息。消费者可以在不同的节点或者不同的系统中部署,实现分布式的消息处理。
具体使用
那么我们明白了他的构成 就来看如何进行使用
引入Spring RabbitMQ依赖:
在项目的构建文件(如Maven的pom.xml)中添加Spring RabbitMQ的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置RabbitMQ连接:
在Spring Boot的配置文件(如application.properties或application.yml)中添加RabbitMQ的连接配置:
spring.rabbitmq.host=your-rabbitmq-host
spring.rabbitmq.port=5672
spring.rabbitmq.username=your-username
spring.rabbitmq.password=your-password
- 创建消息发送者:
创建一个消息发送者(Producer)的类,使用Spring RabbitMQ提供的RabbitTemplate来发送消息。在发送消息之前,需要注入RabbitTemplate并配置交换器和路由键:import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;@Component public class MessageSender {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendMessage(String message) {rabbitTemplate.convertAndSend("exchange-name", "routing-key", message);} } - 创建消息接收者:
创建一个消息接收者(Consumer)的类,使用Spring RabbitMQ提供的@RabbitListener注解来监听队列并处理接收到的消息:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageReceiver {@RabbitListener(queues = "queue-name")public void receiveMessage(String message) {System.out.println("消费者接收到消息: " + "【"+message+"】");// 处理接收到的消息逻辑}
}
消息发送与接收:
在需要发送消息的地方,注入MessageSender并调用sendMessage方法发送消息:
@Autowired
private MessageSender messageSender;public void send() {for(int i=0;i<100;i+=2){messageSender.sendMessage("hello, message_"+i);}
}
运行效果

消息的可靠性投递:
为了实现消息的可靠性投递,可以使用以下方法:
- 消息持久化:在发送消息时,将消息设置为持久化。通过
MessageProperties中的setDeliveryMode方法将消息的传递模式设置为2(持久化)。
rabbitTemplate.convertAndSend("exchange-name", "routing-key", message, message -> {message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);return message;
});
- 发送者确认模式:在发送消息时,启用发送者确认模式,确保消息成功发送到RabbitMQ。
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {if (ack) {// 消息发送成功} else {// 消息发送失败,进行处理}
});
- 消费者确认模式:在消费者处理消息完成后,手动确认消息的消费状态。
@RabbitListener(queues = "queue-name")
public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {try {// 处理接收到的消息逻辑channel.basicAck(deliveryTag, false);} catch (Exception e) {// 处理消息消费失败的情况channel.basicNack(deliveryTag, false, true);}
}
在具体的业务中 我们可以把消息队列作为一个消息的传递,例如订单完成以后 就去通知发货系统跟售后系统去执行 能够解除系统之间的耦合 达到更高效的工作效率
相关文章:
【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程
🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…...
UE5.1_Varest_Warning
UE5.1_Varest_Warning LogVaRest: Warning: UVaRestRequestJSON::GetResponseContentAsString(637): Response content string is cached LogVaRest: Warning: UVaRestRequestJSON::GetResponseContentAsString(637): Response content string is cached是警告也是报错&#…...
硬盘温度过高会怎么办?机箱温度多少算正常?
硬盘温度 硬盘在使用过程中,断电很容易导致数据丢失,但如果温度过高,也可能对硬盘造成损坏。 硬盘的温度是决定电脑能否正常使用的重要因素。 如果长时间读取和存储数据,硬盘的温度会升高。 那么,硬盘的正常温度是多少…...
fs模块_写入文件
fs:file system(文件系统) fs 模块可以实现与硬盘的交互例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作 // 需求: // 新建一个文件,座右铭.txtÿ…...
flutter无法在windows平台上拖拽文件到它的窗口中
我碰到的问题是调试模式下没办法拖拽。 即便使用了第三方包desktop_drop和cross_file,还是这样。 但是一旦构建之后就能正常运行了。 推测是在构建的过程中,flutter往windows包裹代码中加了东西。 跟AI对话之后,推测一个可能的解决方法是修改…...
[递归、搜索、回溯]----递归
前言 作者:小蜗牛向前冲 专栏:小蜗牛算法之路 专栏介绍:"蜗牛之道,攀登大厂高峰,让我们携手学习算法。在这个专栏中,将涵盖动态规划、贪心算法、回溯等高阶技巧,不定期为你奉上基础数据结构…...
XS2100S:IEEE 802.3af/at 兼容、用电设备接口控制器,集成功率MOSFET V1.0.3
XS2100S:IEEE 802.3af/at 兼容、用电设备接口控制器,集成功率MOSFET V1.0.3 北京冠宇铭通 肖小姐 概述 XS2100S 为用电设备 (PD) 提供符合以太网供电 (PoE)系统 IEEE802.3af/at 标准的完整接口。 XS2100S 为 PD 提供检测信号、分级信号以及带有浪…...
智慧城市如何助力疫情防控:科技赋能城市安全
目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来,全球范围内…...
Chromium内核浏览器编译记(四)Linux版本CEF编译
转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/136508294 本文出自 容华谢后的博客 0.写在前面 本篇文章是用来记录编译Linux版本CEF的步骤和踩过的坑,以防止后续再用到的时候忘记,同时也希望能够帮助到遇到同样问…...
NextJs教程系列(一):介绍安装
什么是 Next.js Next.js 是一个用于构建全栈 Web 应用程序的 React 框架。您可以使用 React 组件来构建用户界面,并使用 Next.js 来构建其他功能和优化。 Next.js 的特点 构建全栈 Web 应用程序的 React 框架。为 React 提供了开箱即用的服务器端渲染。为 React …...
python界面开发 - Menu (popupmenu) 右键菜单
文章目录 1. python图形界面开发1.1. Python图形界面开发——Tkinter1.2. Python图形界面开发——PyQt1.3. Python图形界面开发——wxPython1.4. Python图形界面开发—— PyGTK:基于GTK1.5. Python图形界面开发—— Kivy1.6. Python图形界面开发——可视化工具1.7. …...
微服务架构 | 多级缓存
INDEX 通用设计概述2 优势3 最佳实践 通用设计概述 通用设计思路如下图 内容分发网络(CDN) 可以理解为一些服务器的副本,这些副本服务器可以广泛的部署在服务器提供服务的区域内,并存有服务器中的一些数据。 用户访问原始服务器…...
怎么将pom在文件放到src下方
今天在IDEA从git拉取项目的时候,发现pom.xml文件在文件夹src的上方,平时看惯了项目的pom.xml文件在文件夹src的下方,应该怎么去设置呢? 点击设置——>点击Folder Always on Top 即可 参考:http://t.csdnimg.cn/s34…...
浅谈网络爬虫与Web安全
网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定的规则自动抓取万维网资源的程序或者脚本,已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取Web网页、文档甚至图片、音频、视频等资源,…...
C++vector的使用方法
文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义(1)构造函数(2)拷贝构造函数(2)赋值重载 2. vector 增删查改(1)operator [](2&#x…...
视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet
视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet 真没想到,举例视频生成上一轮的集中爆发才过去三个月,没想OpenAI一出手,该领域又直接变天了自打2.16日OpenAI发布sora以来,不但把同时…...
4.1k star,官方出品的redis桌面管理工具——redislnsight
导航 令人抓狂的大key加载RedisInsight 简介RedisInsight的亮点GitHub 地址安装和使用RedisInsight 下载安装 使用RedisInsight redis数据库可视化直观的CLI(Command-Line Interface)日志分析和命令分析 结语参考 令人抓狂的大key加载 工欲善其事必先利…...
论文目录3:大模型时代(2023+)
1 instruction tuning & in context learning 论文名称来源主要内容Finetuned Language Models Are Zero-Shot Learners2021 机器学习笔记:李宏毅ChatGPT Finetune VS Prompt_UQI-LIUWJ的博客-CSDN博客 早期做instruction tuning的work MetaICL: Learning to …...
FPGA IBUFG
IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO和其它内部CLB等没有物理连接。 所以,IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…...
探索数据结构:单链表的实战指南
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty‘s blog 前言 在上一章节中我们讲解了数据结构中的顺序表,知道了顺序…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
