SpringBoot RabbitMQ收发消息、配置及原理

这篇具有很好参考价值的文章主要介绍了SpringBoot RabbitMQ收发消息、配置及原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天分析SpringBoot通过自动配置集成RabbitMQ的原理以及使用。

AMQP概念

RabbitMQ是基于AMQP协议的message broker,所以我们首先要对AMQP做一个简单的了解。

AMQP (Advanced Message Queuing Protocol) is a messaging protocol that enables conforming client applications to communicate with conforming messaging middleware brokers.

AMQP是Advanced Message Queuing Protocol的缩写,是一个消息收发客户端与消息中间件都要遵守的消息通讯协议。

AMQP消息模型如下图:
SpringBoot RabbitMQ收发消息、配置及原理,java-rabbitmq,spring boot,rabbitmq
消息有发布者发送给Exchange,Exchange通过绑定路由规则路由该消息到消息队列中,之后消息中间件投递该消息给指定的消费者、或者由消费者按需拉取/消费消息。

消息丢失问题:网络原因、或者消费者消费逻辑的原因均可能导致消息发送(接收)失败,AMQP通过消息确认(message acknowledgements)机制来处理消息发送失败:消息送达消费者后,消费者需发送确认消息通知broker。启用消息确认机制后,broker必须在收到确认之后才能从队列中移除消息,确保消息不丢失。

消息无法送达问题:消息无法送达消费者的情况下,该消息会根据参数设置被broker返回给消息发送者、直接丢弃、或者丢入“死信”队列。

Exchange Type

AMQP消息发送给Exchange,Exchange接收到消息后路由给0个或多个队列,路由规则依赖于Exchange Type。

AMQP包含如下Exange Type:

  1. Direct exchange:路由匹配后直接投递
  2. Fanout exchange:消息投递给绑定到当前Exchange的所有队列(不需要匹配)。
  3. Topic exchange:根据订阅主题投递消息。
  4. Headers exchange:路由规则定义在消息头信息中,根据头信息匹配投递。

队列

队列是AMQP中存储消息的地方,队列具有如下属性:

  1. Name:队列名称。每一个队列都有名称,不指定名称则broker会自动生成一个名称。"amq."开头的队列名称是AMQP的保留名称,不允许应用层使用。
  2. Durable (the queue will survive a broker restart):存活周期。队列创建的时候可以被声明为持久队列或临时队列,持久队列的元数据存储在硬盘、而临时队列存储在内存。
  3. Exclusive (used by only one connection and the queue will be deleted when that connection closes):独占队列,连接关闭后队列删除。
  4. Auto-delete (queue that has had at least one consumer is deleted when last consumer unsubscribes):队列必须绑定至少一个消费者,没有消费者绑定到给队列则队列自动删除。
  5. Arguments (optional; used by plugins and broker-specific features such as message TTL, queue length limit, etc):其他消息参数。

队列使用之前必须首先声明(通过声明指定消息队列参数),声明队列等同于创建队列,声明队列时如果队列已经存在,则:声明的参数与已存在队列参数相同,对当前已存在队列没有任何影响,如果声明的参数与已存在队列参数不同,抛出异常。

绑定

绑定指的是Exchange路由消息到队列的规则。队列首先必须绑定到Exchange之后,Exchange才能发送消息到该队列。routing key是绑定的可选属性,特定Exchange(Direct exchange)发送消息到队列时会根据routing key进行匹配。

消费者

消费者通过以下两种方式从队列中消费消息:

  1. Push方式:消息主动投递给消费者(推荐方式)。
  2. Poll方式:消费者轮询获取(性能原因,不推荐)。

((Consumer) Delivery Acknowledgements)投递确认

由于网络原因,或者消费者应用在消息消费过程中发生错误导致消息消费失败------均可导致消息丢失。

为了尽可能避免消息丢失,AMQP提供了两种消息确认机制:

  1. 自动确认模式:broker发送消息之后确认。
  2. 显式确认:消费者反馈确认消息。

显式确认模式下,由消费者决定确认消息的反馈时机:收到消息后立即反馈、或者消息持久化之后反馈、或者消息完全被消费(消费业务处理完成)之后反馈。

如果消费者一直不给broker发送确认信息,broker会重新投递消息给其他消费者、如果当前没有其他消费者注册到当前队列的话,broker会一直保存该消息直到有新的消费者注册上来之后发送。

拒信

消费者可给broker返回拒绝消息指令,以告知broker消费者处理消息失败。根据消费者的指令,broker可以丢弃该消息、或者重新进入队列等待再次消费。进入队列等待再次消费的情况下,消费者需注意避免造成该消息的循环投递。

Prefetching Messages

多个消费者共享同一队列的场景下,broker可以控制每一消费者最多可以并发处理的消息数量(消费者返回消息确认前brokenr最多投递到该消费者的消息数量)。这种机制其实是一种简单的load balance,一个消费者如果长时间不返回消息确认,极有可能说明该消费者的消费能力出现问题。

Connections

与数据库连接类似,AMQP客户端(生产者或者消费者)通过connections连接broker、并通过connection收发消息。

Channels

多数场景下,客户端都需要创建多个连接以便并发处理消息,但是同时创建多个TCP连接在性能和网络管理上都很不划算,因此,AMQP通过channels多路复用TCP连接:一个连接可以包含多个Channels,所有的客户端操作都依赖于Channels执行,每一个Channels都独立运行互不影响。

RabbitMQ

RabbitMQ is the most widely deployed open source message broker.

RabbitMQ是基于AMQP协议的、Erlang开发的被广泛部署的开源消息队列。

有关RabbitMQ的详细特性本文不展开讨论。

RabbitMQ的安装

RabbitMQ基于Erlang,所以安装RabbitMQ之前,你必须已经安装好了Erlang。不同版本的RabbitMQ对Erlang的版本也有不同的要求,详情参见https://www.rabbitmq.com/which-erlang.html。

根据下载安装Erlang/OTP 25.3.2。

之后从RabbitMQ官网(https://www.rabbitmq.com/install-windows.html)下载安装RabbitMQ(rabbitmq-server-3.12.12.exe)。

SpringBoot项目配置RabbitMQ

RabbitMQ is a lightweight, reliable, scalable, and portable message broker based on the AMQP protocol. Spring uses RabbitMQ to communicate through the AMQP protocol.

Spring使用RabbitMQ作为AMQP协议下的消息队列broker,SpringBoot提供了对RabbitMQ的基于autoConfiguration的支持。

pom文件引入RabbitMQ

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

yml文件配置

application.yml文件中配置RabbitMQ:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    #确认消息已发送到交换机(Exchange)
    publisher-confirm-type: correlated
    #确认消息已发送到队列(Queue)
    publisher-returns: true
    #消费方消息确认
    listener:
      simple:
        #确认方式:手动确认
        acknowledge-mode: manual
        # 拒信不重新入队列
        default-requeue-rejected: false
        retry:
          enabled: true #监听重试是否可用
          max-attempts: 5 #最大重试次数,默认为3
    	  retryTime: 120000 # 重试间隔时间(毫秒)

发送消息

创建一个RabbitMQ消息发送服务并注入到IoC容器中:

@Component
public class RabbitMQService {
    private final AmqpAdmin amqpAdmin;

    private final AmqpTemplate amqpTemplate;

    public RabbitMQService(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) {
        this.amqpAdmin = amqpAdmin;
        this.amqpTemplate = amqpTemplate;
    }
    public void sendMessage(String message){
        amqpTemplate.convertAndSend(message);
    }
}

消息接收

使用@RabbitListener注解接收来自于RabbitMQ的消息:

    @RabbitListener(queues = "someQueue")
    public void processMessage(String content) {
        log.info("recieve message from rabbitMQ:"+content);
    }

需要特别注意:

By default, if retries are disabled and the listener throws an exception, the delivery is retried indefinitely. You can modify this behavior in two ways: Set the defaultRequeueRejected property to false so that zero re-deliveries are attempted or throw an AmqpRejectAndDontRequeueException to signal the message should be rejected. The latter is the mechanism used when retries are enabled and the maximum number of delivery attempts is reached.

默认的重试被关闭的情况下,如果消息监听器抛出异常、发送方将会无限重试。我们可以通过如下两种方式避免这种情况:设置defaultRequeueRejected参数为false,因此失败消息不会重新进入队列。或者抛出AmqpRejectAndDontRequeueException异常表明消息应当被丢弃。第二种机制也是重试机制打开后、重试次数达到上限后采用的机制。

RabbitMQ涉及的内容比较多,详情后补。

春节愉快,开工大吉!文章来源地址https://www.toymoban.com/news/detail-831286.html

到了这里,关于SpringBoot RabbitMQ收发消息、配置及原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【RabbitMQ】介绍及消息收发流程

    RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,

    2024年02月07日
    浏览(38)
  • SpringCloudStream集成RabbitMQ实现消息收发

    ​ SpringCloudStream 是一个构建高扩展和事件驱动的微服务系统的框架,用于连接共有消息系统,官网地址: spring.io/projects/sp… 。整体上是把各种花里胡哨的MQ产品抽象成了一套非常简单的统一的编程框架,以实现事件驱动的编程模型。社区官方实现了RabbitMQ,Apache Kafka,Kaf

    2024年02月03日
    浏览(38)
  • 使用StreamBridge实现RabbitMq 消息收发 && ack确认 && 延时消息

    下载地址:link 1.下载完成放到rabbitmq安装目录plugins下 2.执行命令启用插件 3.重启mq Exchanges - add a new exchange - type 出现x-delayed-message即安装成功

    2024年02月11日
    浏览(40)
  • RabbitMQ保证消息的可靠投递,Java实现RabbitMQ消息的可靠投递,Springboot实现RabbitMQ消息的可靠投递

    我们先看一串代码,并思考一下为什么要先入库然后发MQ: 如果先发MQ的话,如果入库失败,就会导致MQ消息无法回滚了。今天我们就好好聊一聊RabbitMQ消息可靠投递的问题。 ① 消息从生产者发送到Broker 生产者把消息发送到Broker之后,如何知道自己的消息有没有被Broker成功接

    2024年02月11日
    浏览(52)
  • Spring Boot 中的 RabbitMQ 的消息接收配置是什么,原理,如何使用

    RabbitMQ 是一个流行的消息队列系统,它可以用于在应用程序之间传递消息。Spring Boot 提供了对 RabbitMQ 的支持,我们可以使用 Spring Boot 中的 RabbitMQ 消息接收配置来接收 RabbitMQ 中的消息。本文将介绍 RabbitMQ 的消息接收配置的原理和如何在 Spring Boot 中使用它。 在 RabbitMQ 中,消

    2024年02月13日
    浏览(47)
  • 微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式

    目录 1. 本文简介:  1.1 java序列化的缺点 --- 1.1.1 无法跨语言 ---1.1.2  易被攻击 --- 1.1.3 序列化后的流太大 --- 1.1.4 序列化性能太差 2. 配置总览 2.1  基础配置  2.2 连接重试配置  2.3  异常重试机制 2.4 确认模式(本篇是自动)  --- 2.4.1 如图所示 2.5 发送确认设置  --- 2.5.1 参数解释

    2024年02月17日
    浏览(46)
  • 如何在Window系统中安装RabbitMQ以及在.NET平台上实现收发消息功能

    以下是接收客户端代码: #region RabbitMQ接收客户端 private ConnectionFactory factory; private IConnection connection; private IModel channel; private EventingBasicConsumer consumer; /// /// 开始创建连接对象 /// public void StartReceiving(string ListenIp,string queueName, string QueueUserName,string QueueUserPassword, int Port = 5672) {

    2024年02月11日
    浏览(40)
  • Kafka:springboot集成kafka收发消息

    kafka环境搭建参考Kafka:安装和配置_moreCalm的博客-CSDN博客 1、springboot中引入kafka依赖 2、配置application.yml 传递String类型的消息 3、controller实现消息发送接口 4、component中实现接收类HelloListener  5、测试 浏览器访问该接口并查看控制台         接收成功   传递对象类型的消息

    2024年02月13日
    浏览(41)
  • 195、SpringBoot--配置RabbitMQ消息Broker的SSL 和 管理控制台的HTTPS

    开启Rabbitmq的一些命令: 小黑窗输入: rabbitmq-plugins enable rabbitmq_management 启动控制台插件,就是启动登录rabbitmq控制台的页面 rabbitmq_management 代表了RabbitMQ的管理界面。 rabbitmq-server 启动rabbitMQ服务器 上面这个:rabbitmq-plugins enable rabbitmq_management 启动控制台插件,就是启动登录

    2024年02月03日
    浏览(46)
  • 微服务: 04-springboot中rabbitmq的yml或properties配置,消息回收,序列化方式

    目录 1. 本文简介:  1.1 java序列化的缺点 --- 1.1.1 无法跨语言 ---1.1.2  易被攻击 --- 1.1.3 序列化后的流太大 --- 1.1.4 序列化性能太差 2. 配置总览 2.1  基础配置  2.2 连接重试配置  2.3  异常重试机制 2.4 确认模式(本篇是自动)  --- 2.4.1 如图所示 2.5 发送确认设置  --- 2.5.1 参数解释

    2024年02月04日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包