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

这篇具有很好参考价值的文章主要介绍了【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生

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

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

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

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

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

努力的苏泽http://suzee.blog.csdn.net/


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

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

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生

当然结果不尽人意

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

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

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生

这 就是同步处理

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

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生

异步通讯

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

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

消息队列 --RabbitMQ

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

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生

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

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

生产者:


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

生产者的主要职责包括:

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

消费者:


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

消费者的主要职责包括:

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

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

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生

深入原理

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生

他由下面四个部分组成:

  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);
    }
}

运行效果

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程,《Spring 狂野之旅:底层原理高级进阶》 🚀,java-rabbitmq,spring,云原生文章来源地址https://www.toymoban.com/news/detail-840097.html

消息的可靠性投递: 为了实现消息的可靠性投递,可以使用以下方法:

  • 消息持久化:在发送消息时,将消息设置为持久化。通过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:异步处理机制的基础--消息队列 原理讲解+使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MQ 系列】SpringBoot + RabbitMq 消息确认/事务机制的使用姿势

    我们知道 RabbitMq 提供了两种机制,来确保发送端的消息被 brocke 正确接收,本文将主要介绍,在消息确认和事物两种机制的场景下,发送消息的使用姿势 首先创建一个 SpringBoot 项目,用于后续的演示 springboot 版本为 2.2.1.RELEASE rabbitmq 版本为  3.7.5   依赖配置文件 pom.xml 在 a

    2024年01月18日
    浏览(46)
  • RabbitMQ--基础--8.1--消息确认机制--接受确认机制(ACK)

    代码位置 消费者收到Queue中的消息,但没有处理完成就宕机的情况,这种情况下就可能会导致消息丢失。 为了避免这种情况发生,我们可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除。 如果RabbitMQ没有收

    2024年02月10日
    浏览(50)
  • 高效处理消息:使用Spring Boot实现消息重试机制

    当涉及到消息发送和接收的可靠性,Spring Boot提供了一些机制来确保消息的可靠传递。其中包括消息确认机制和重试机制。下面是一个示例代码,演示如何在Spring Boot中实现可靠的消息发送和接收。 首先,我们需要配置RabbitMQ的连接信息和相关属性。在 application.properties 文件中

    2024年02月11日
    浏览(48)
  • RabbitMQ系列(19)--实现在RabbitMQ宕机的情况下对消息进行处理

    前言:在生产环境中由于一些不明原因,导致RabbitMQ重启的情况下,在RabbitMQ重启期间生产者投递消息失败,生产者发送的消息会丢失,那这时候就需要去想在极端的情况下,RabbitMQ集群不可用的时候,如果去处理投递失败的消息。 1、在config包里新建一个名为ConfirmConfig的类用

    2024年02月15日
    浏览(52)
  • 【Android】多线程编程、异步消息处理机制以及new Handler()被标记为过时的解决办法,解决Handler内存泄漏问题和AsyncTask的基本用法

    1.1 弱引用 WeakReference (弱引用)是一种在Java中用于管理对象的引用的特殊引用类型。它的作用是在垃圾回收过程中,允许对象在没有强引用指向它时被回收( 当一个对象只有弱引用指向它,而没有强引用指向它时,垃圾回收器可能会在下一次垃圾回收时回收该对象,即使系

    2024年02月04日
    浏览(48)
  • RabbitMQ异步与重试机制

            先来回顾一下前文,我们先基于Java原生语言,利用多线程和锁实现了串行/并行任务(Java串行/并行任务实现);之后利用SpringBoot为我们封装好的功能,尝试用SpringBoot自带的API实现了异步调用,并在此基础上,统一管理了多线程的事务(SpringBoot异步任务及并行事务实

    2024年02月07日
    浏览(37)
  • RabbitMQ防止消息重复消费、保证异步消息的幂等性

    一、rabbitmq出现消息重复的场景 1、消费成功,没有进行ack,这时 Broker 会重新发送 2、不确认(unack)或 reject 之后,重新排队,Broker 会重新发送 3、消费成功,ack时宕机,没有ack成功,消息由unack变为ready,Broker又重新发送 4、总的来说就是 Broker 发送消息后,消费端收到消息

    2024年02月13日
    浏览(45)
  • rabbitmq消息可靠性之消息回调机制

    rabbitmq消息可靠性之消息回调机制 rabbitmq在消息的发送与接收中,会经过上面的流程,这些流程中每一步都有可能导致消息丢失,或者消费失败甚至直接是服务器宕机等,这是我们服务接受不了的,为了保证消息的可靠性,rabbitmq提供了以下几种机制 生产者确认机制 消息持久

    2024年02月08日
    浏览(56)
  • rabbitmq消息确认机制

    (1) publish === broker 只要broker收到消息,就会执行 confirmCallback (2) exchange === queue 如果exchange有消息没有成功发送至queue,就会执行RuturnCallback,例:routing key错误导致发送消息到队列失败 (3)RabbitmqConfig (1) queue === consumer 默认是ack,consumer只要拿到消息就会自动确认,服务端

    2024年02月13日
    浏览(42)
  • RabbitMQ 消息确认机制

    为了保证消息从队列可靠的到达消费者,RabbitMQ 提供了消息确认机制(Message Acknowledgement)。消费者在订阅队列时,可以指定 autoAck 参数,当 autoAck 参数等于 false 时,RabbitMQ 会等待消费者显式地回复确认信号后才从内存(或者磁盘)中移除消息(实际上是先打上删除标记,之

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包