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

news2024/11/24 20:37:45

今天分析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消息模型如下图:
在这里插入图片描述
消息有发布者发送给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涉及的内容比较多,详情后补。

春节愉快,开工大吉!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springmvc 的参数绑定之list集合

标签中name属性的值就是pojo类的属性名 参数绑定4 list [对象] <form action"teaupd.do" method"post"> <c:forEach items"${list}" var"tea" varStatus "status"> 教师编号&#xff1a;<input…

大模型专题:2023爱分析·大模型厂商全景报告

今天分享的是大模型系列深度研究报告&#xff1a;《大模型专题&#xff1a;2023爱分析大模型厂商全景报告》。 &#xff08;报告出品方&#xff1a;爱分析&#xff09; 报告共计&#xff1a;80页 研究范围定义 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成…

统计图环形图绘制方法

统计图环形图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 在网上看到一种类很有艺术感的环形图图例&#xff0c;一时手痒也就搞了一个绘制方法。 本方法采用C语言的最基本功能&…

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即…

08-静态pod(了解即可,不重要)

我们都知道&#xff0c;pod是kubelet创建的&#xff0c;那么创建的流程是什么呐&#xff1f; 此时我们需要了解我们k8s中config.yaml配置文件了&#xff1b; 他的存放路径&#xff1a;【/var/lib/kubelet/config.yaml】 一、查看静态pod的路径 [rootk8s231 ~]# vim /var/lib…

【网工】华为设备命令学习(防火墙)

实验目的PC1连接到外网。 关于防火墙的其他知识后续补充。 ensp里的防火墙 用户名admin 密码Admin123 防火墙的接口类型 1.路由模式 物理口可以直接配. ​​​​​2.交换模式 物理口不能直接配IP&#xff0c;类似交换机&#xff0c;可以配vlan 首先我们先要对各个设备进…

前端开发:Vue框架与前端部署

Vue Vue是一套前端框架&#xff0c;免除原生)avaScript中的DOM操作&#xff0c;简化书写。是基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。简单来说&#xff0c;就是数据变化的时候, 页面会自动刷新, 页面变化的时…

Crypto-RSA2

题目&#xff1a;&#xff08;BUUCTF在线评测 (buuoj.cn)&#xff09; 已知e,n,dp/(dq),c求明文: 首先有如下公式&#xff1a; dp ≡ d mod (p-1) &#xff0c;ed ≡ 1 mod φ(n) &#xff0c;npq &#xff0c;φ(n)(p-1)(q-1) python代码实现如下&#xff1a; import libnu…

npm报错之package-lock.json found. 问题和淘宝镜像源过期问题

1、package-lock.json found. 问题的解决 在执行yarn add react-transition-group -S 安装react-transition-group时出现package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in orde…

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV+最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能)

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统&#xff08;OpenCV最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能&#xff09; 文章目录 关于旧文新发毕设结构主页面验证码识别效果管理页面人脸信息采集管理实时数据更新签到结果…

使用Docker Compose搭建Redis主从复制

在Docker中搭建Redis主从架构非常方便&#xff0c;下面是一个示例&#xff0c;演示一下如何使用Docker Compose搭建一个Redis主从复制环境。首先&#xff0c;确保我们本地环境已经安装了Docker和Docker Compose。 我这里使用OrbStack替代了Docker desktop。 1. 创建一个名为r…

数据结构与算法:双向链表

朋友们大家好啊&#xff0c;在上节完成单链表的讲解后&#xff0c;我们本篇文章来对带头循环双向链表进行讲解 双向链表 双向链表、头节点和循环的介绍构建双向链表节点的构建初始化双向循环链表&#xff08;空链表&#xff09;销毁双向链表 链表的打印双向链表头尾的插与删尾插…

CSS3学习(二)

目录&#xff1a; 1. 字体属性 1.1 字体系列 1.2 字体大小 1.3 字体粗细 1.4 文字样式 1.5 字体复合属性 1.6 总结 2 文本属性 2.1 文本颜色 2.2 对齐文本 2.3 装饰文本 2.4 文本缩进 2.5 行间距 2.6 总结 1. 字体属性 1.1 字体系列 使用font-family属性定义文…

JavaScript设计模式与开发实战

JavaScript设计模式与开发实践 第一章、面向对象的JavaScript 1.1 多态 类似java面向对象&#xff0c;通过继承共有特征&#xff0c;来实现不同方法。JavaScript的多态就是把“做什么”和“谁去做”分离&#xff0c;消除类型间的耦合关系。 他的作用就是把过程化的条件分支…

【JavaEE】spring boot快速上手

SpringBoot快速上手 文章目录 SpringBoot快速上手Maven会出现的一个官方bug创建完项目之后常用的的三个功能依赖管理Maven仓库中央仓库本地仓库国内源配置私服 springboot项目创建什么是springspring boot项目的创建Hello Worldweb服务器 SpringMVC什么是SpringWebMVC什么是MVC…

Sora:AI视频生产力的颠覆性跃进,让创意瞬间成“视界”!

在AI视频技术宇宙中&#xff0c;RunwayGen2、Stable Video Diffusion和Pika等明星产品早已名声在外。然而&#xff0c;今日横空出世的Sora犹如一颗璀璨新星&#xff0c;以其震撼性的创新突破&#xff0c;在视频制作领域掀起了一场革命&#xff01;相较于市面上同类AI视频神器&a…

【Java程序员面试专栏 分布式中间件】Redis 核心面试指引

关于Redis部分的核心知识进行一网打尽,包括Redis的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 明确redis的特性、应用场景和数据结构 什么是Redis,Redis有哪些应用场景 Redi…

互联网加竞赛 基于计算机视觉的身份证识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-sen…

Sora:继ChatGPT之后,OpenAI的又一力作

关于Sora的报道&#xff0c;相信很多圈内朋友都已经看到了来自各大媒体铺天盖地的宣传了&#xff0c;这次&#xff0c;对于Sora的宣传&#xff0c;绝不比当初ChatGPT的宣传弱。自OpenAI发布了GPT4之后&#xff0c;就已经有很多视频生成模型了&#xff0c;不过这些模型要么生成的…

【JavaEE】_CSS选择器

目录 1. 基本语法格式 2. 引入方式 2.1 内部样式 2.2 内联样式 2.3 外部样式 3. 基础选择器 3.1 标签选择器 3.2 类选择器 3.3 ID选择器 4. 复合选择器 4.1 后代选择器 4.2 子选择器 4.3 并集选择器 4.4 伪类选择器 1. 基本语法格式 选择器若干属性声明 2. 引入…