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

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔 

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/


在认识消息队列之前 我想有必要说明什么是异步处理

今天是女神节 现在我们的坤坤 很希望约他的女神出来

当然结果不尽人意

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

问完一个女神 再问候下一个

这 就是同步处理

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

异步通讯

异步同学 顾名思义 “异”就是不同  不同的步骤去执行 就不是一个线上的  他不必等待上一位女神给他回复 或者他不必完成上一次的任务(可以理解为群发) 就能够直接执行下一步  这 就是异步处理(异步通讯)

但是 要怎么样实现这个模型?  就引入到了这里的主题 消息队列

消息队列 --RabbitMQ

RabbitMQ是一个消息队列中间件,用于实现应用程序的异步和解耦,同时也能起到消息缓冲和消息分发的作用。它是基于AMQP(高级消息队列协议)的一种消息中间件,最初起源于金融系统,用于在分布式系统中存储和转发消息。RabbitMQ具有高可用性、高性能和灵活性等特点,因此在互联网公司和分布式系统中得到广泛应用

我们来解析其架构 就会发现其实这是一个很简单的东西 

无非就是 发布(也可以说是生产)和消费

生产者:


生产者是消息队列中的消息发送方。它负责创建并发送消息到消息队列中,供消费者进行消费。生产者通常与特定的业务逻辑相关联,根据业务需求生成消息并将其发送到消息队列。生产者将消息发送到特定的队列或主题,然后消息队列会将消息传递给一个或多个消费者进行处理。

生产者的主要职责包括:

  • 创建消息并设置相关的属性(如消息内容、优先级、过期时间等)。
  • 将消息发送到消息队列中。
  • 处理发送消息过程中可能出现的异常情况。

消费者:


消费者是消息队列中的消息接收方。它负责从消息队列中获取消息并进行处理。消费者通常与特定的业务逻辑相关联,负责处理接收到的消息,执行相应的操作,可能是业务逻辑的处理、数据存储、日志记录等。

消费者的主要职责包括:

  • 从消息队列中获取消息。
  • 处理接收到的消息,执行相应的操作。
  • 确认消息的消费状态(如消息确认、消息拒绝、消息重试等)。
  • 处理消费消息过程中可能出现的异常情况。

生产者和消费者的协作可以实现解耦和异步通信的优势。生产者可以独立于消费者的处理速度和状态,将消息发送到消息队列中,而消费者可以根据自己的处理能力和需求从消息队列中获取并处理消息。这种解耦和异步通信的方式可以提高系统的可伸缩性、可靠性和灵活性。

深入原理

他由下面四个部分组成:

  1. 生产者(Producer):
    生产者负责创建并发送消息到RabbitMQ的交换器。生产者将消息发布到特定的交换器,并可以指定消息的路由键(Routing Key)。生产者可以根据业务需求生成消息,并选择将消息发送到特定的交换器中。

  2. 交换器(Exchange):
    交换器是消息的分发中心,它接收来自生产者的消息,并根据消息的路由键将消息路由到一个或多个绑定的队列中。交换器根据事先定义的规则(Exchange Type)来决定如何路由消息。RabbitMQ提供了几种常见的交换器类型,包括直连交换器(Direct Exchange)、主题交换器(Topic Exchange)、广播交换器(Fanout Exchange)和首部交换器(Headers Exchange)。

  3. 队列(Queue):
    队列是消息的存储和传递载体。它是消息的终点,消费者通过订阅队列来接收消息。每个消息都被发送到一个特定的队列中,消费者从队列中获取消息并进行处理。队列具有先进先出的特性,保证了消息的顺序性。

  4. 消费者(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

  1. 创建消息发送者:
    创建一个消息发送者(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 {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
        
        public void sendMessage(String message) {
            rabbitTemplate.convertAndSend("exchange-name", "routing-key", message);
        }
    }

  2. 创建消息接收者:
    创建一个消息接收者(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);
    }
}

在具体的业务中 我们可以把消息队列作为一个消息的传递,例如订单完成以后 就去通知发货系统跟售后系统去执行 能够解除系统之间的耦合 达到更高效的工作效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/440584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

业务代码中如何使用装饰器模式?

装饰器模式&#xff08;Decorator Pattern&#xff09;介绍 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能&#xff0c;装饰器模式使用组合的…

二维码门楼牌管理系统应用场景:社会服务与福利的智能化革新

文章目录 前言一、二维码门楼牌管理系统的基本功能二、在社会服务领域的应用三、在福利保障领域的应用四、结论 前言 在数字化浪潮的推动下&#xff0c;二维码门楼牌管理系统以其便捷、高效的特点&#xff0c;正逐渐渗透到社会服务和福利的各个领域。这一系统不仅为市民提供了…

【深入理解设计模式】享元设计模式

享元设计模式 概述 享元设计模式&#xff08;Flyweight Design Pattern&#xff09;是一种用于性能优化的设计模式&#xff0c;它通过共享尽可能多的相似对象来减少对象的创建&#xff0c;从而降低内存使用和提高性能。享元模式的核心思想是将对象的共享部分提取出来&#xff…

lqb省赛日志[2/37]

一只小蒟蒻备考蓝桥杯的日志 文章目录 笔记&#xff01;lqb不能用to_string和atoi历史遗留问题1 刷题心得小结 笔记 &#xff01;lqb不能用to_string和atoi 有替代方法 参考 不使用C 11的整数转字符串 C语言提供了一种方法。 #include sstream &#xff08;我没学&#xff0…

MySQL面试题-锁(答案版)

锁 1、MySQL 有哪些锁&#xff1f; &#xff08;1&#xff09;全局锁 加了全局锁之后&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行以下操作&#xff0c;都会被阻塞&#xff1a; 对数据的增删改操作&#xff0c;比如 insert、delete、update等语句&…

【粉丝福利】探秘内部审计数字化之道:精准解析转型方法与成功路径

&#x1f33c;前言 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应…

【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用

目录 一、Linux编译器-gcc/g1.1 gcc/g 使用方法1.2 程序的翻译过程1.3 链接 -- 动静态链接特点及区别 二、Linux调试器-gdb2.1 背景2.2 使用方法 三、Linux项目自动化构建工具-make/Makefile3.1 背景3.2 原理3.3 项目清理 一、Linux编译器-gcc/g 1.1 gcc/g 使用方法 格式&…

Linux mmap系统调用

文章目录 前言一、mmap()函数简介二、代码演示2.1 mmap使用场景2.2 私有匿名映射2.3 私有文件映射2.4 共享匿名映射2.5 共享文件映射 参考 前言 NAMEmmap, munmap - map or unmap files or devices into memorySYNOPSIS#include <sys/mman.h>void *mmap(void *addr, siz…

如何使用 ArcGIS Pro 制作三维地形图

伴随硬件性能的提高和软件算法的优化&#xff0c;三维地图的应用场景会越来越多&#xff0c;这里为大家介绍一下在ArcGIS Pro怎么制作三维地形图&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM和影像数据&#xff0c;除了DEM和影像数据…

Python数据处理实战(4)-上万行log数据提取并作图进阶版

系列文章&#xff1a; 0、基本常用功能及其操作 1&#xff0c;20G文件&#xff0c;分类&#xff0c;放入不同文件&#xff0c;每个单独处理 2&#xff0c;数据的归类并处理 3&#xff0c;txt文件指定的数据处理并可视化作图 4&#xff0c;上万行log数据提取并作图进阶版&a…

vue3的开发小技巧

「总之岁月漫长&#xff0c;然而值得等待。」 目录 父组件调用子组件函数如何访问全局api 父组件调用子组件函数 ref, defineExpose //父组件 代码 <child ref"ch">this.$refs.ch.fn();//子组件 函数抛出 const fn () > { }; defineExpose({ fn });如何…

Type-C接口PD协议统一:引领电子科技新纪元的优势解析

在电子科技日新月异的今天&#xff0c;充电接口的统一化已经成为了业界的一大趋势。其中&#xff0c;Type-C接口凭借其传输速度快、使用便捷等优点&#xff0c;迅速成为了市场上的主流选择。而PD&#xff08;Power Delivery&#xff09;协议的统一&#xff0c;更是为Type-C接口…

投标中项目组织结构的设置以及调整(样式表,多级列表)

投标中项目组织结构的设置以及调整&#xff08;样式表&#xff0c;多级列表&#xff09;&#xff1a; 投标项目中需要处理大规模的文字排版&#xff0c;就是需要用到样式表&#xff08;解决层级关系&#xff09;&#xff0c;多级列表&#xff08;解决自动编号的问题&#xff0…

CSP-J 2021 T2 插入排序

文章目录 题目传送门算法解析总代码提交记录尾声 题目传送门 洛谷 P7910 [CSP-J 2021] 插入排序 算法解析 千万不要题目让你插入排序你就插入排序 首先可以用 p a i r pair pair 来存储元素的值&#xff08; f i r s t first first&#xff09;和原来的下标&#xff08; s…

Vue组件中的scoped属性

Vue组件中的scoped属性的作用是&#xff1a;当前的单文件组件的css样式只用于当前组件的template模板&#xff0c;在Vue脚手架汇总组件间关系时避免样式命名重复的情况。 原理&#xff1a;使用data-*属性在template模板中使用样式的HTML元素上添加额外属性&#xff0c;再利用标…

【UE5】游戏框架GamePlay

游戏框架 游戏 由 游戏模式(GameMode) 和 游戏状态(GameState) 所组成 加入游戏的 人类玩家 与 玩家控制器(PlayerController) 相关联 玩家控制器允许玩家在游戏中拥有 HUD&#xff0c;这样他们就能在关卡中拥有物理代表 玩家控制器还向玩家提供 输入控制&#xff08;Input…

【Qt】四种绘图设备详细使用

绘图设备有4个: **绘图设备是指继承QPainterDevice的子类————**QPixmap QImage QPicture QBitmap(黑白图片) QBitmap——父类QPixmapQPixmap图片类&#xff0c;主要用来显示&#xff0c;它针对于显示器显示做了特殊优化&#xff0c;依赖于平台的&#xff0c;只能在主线程…

掘根教你拿捏C++异常(try,catch,throw,栈解退,异常规范,异常的重新抛出)

在介绍异常之前&#xff0c;我觉得很有必要带大家了解一下运行时错误和c异常出现之前的处理运行时错误的方式。这样子能更深入的了解异常的作用和工作原理 运行阶段错误 我们知道&#xff0c;程序有时候会遇到运行阶段错误&#xff0c;导致程序无法正常运行下去 C在运行时可…

【Springer出版 · EI检索】| 第二届先进无人飞行系统国际会议(ICAUAS 2024)

会议简介 Brief Introduction 2024年第二届先进无人飞行系统国际会议(ICAUAS 2024) 会议时间&#xff1a;2024年6月14日-16日 召开地点&#xff1a;中国南昌 大会官网&#xff1a;ICAUAS 2024-2024 2nd International Conference on Advanced Unmanned Aerial Systems2024 2nd …

即插即用篇 | YOLOv8 引入 ParNetAttention 注意力机制 | 《NON-DEEP NETWORKS》

论文名称:《NON-DEEP NETWORKS》 论文地址:https://arxiv.org/pdf/2110.07641.pdf 代码地址:https://github.com/imankgoyal/NonDeepNetworks 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yaml