RabbitMQ消息持久化机制

news2024/11/24 6:52:51

上一篇说到生产者消息确认机制,它可以确保消息投递到RabbitMQ的队列中,但是消息发送到RabbitMQ以后,如果MQ宕机,也可能导致消息丢失,所以提出了消息持久化。持久化的主要机制就是将信息写入磁盘,当RabbtiMQ服务宕机重启后,从磁盘中读取存入的持久化信息,恢复数据。而持久化机制又可以分为:

  • 交换机持久化
  • 队列持久化
  • 消息持久化

在上一篇的案例代码中,我们故意把交换机的durable设置为false,队列的durable为true。

这里说一下另外两个参数:

  • exclusive:排他队列。如果一个队列被声明为排他队列,那么这个队列只能被第一次声明他的连接所见,并在连接断开的时候自动删除。这里有三点需要说明:
    • 排他队列是基于连接可见的,同一连接的不同信道是可以同时访问同一连接创建的排他队列
    • 如果一个连接已经声明了一个排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同
    • 即使该队列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除的,这种队列适用于一个客户端发送读取消息的应用场景
  • autoDelete:自动删除,如果该队列没有任何订阅的消费者的话,该队列会被自动删除。这种队列适用于临时队列

当重启MQ服务后发现交换机已被销毁,而队列还存在,这是符合我们预期的。

我们在SpringBoot项目中使用spring-boot-starter-amqp 声明的交换机、队列、消息默认都是持久化的。而交换机和队列的持久化从上述代码中可以看到是通过指定durable的值。

在SpringBoot中使用rabbitTemplate.convertAndSend发送消息时

在做消息转换的时候,我们注意到,传入了一个MessageProperties对象。

在MessageProperties中,有个deliveryMode属性,该属性默认值为:MessageDeliveryMode.PERSISTENT(持久化的)

但是要明白即便交换机、队列、消息都设置持久化,也不能保证消息100%不丢失。因为有可能RabbitMQ接收到了消息,但是还没来得及持久化到磁盘,他自己就宕机了,这个时候消息还是会丢失的。

可以考虑生产者在发送消息时在数据库中写入消息日志,但是在后期消息补发的时候就需要人工介入,将失败的消息捞出来然后重新发送。只要消息数据在,即便MQ宕机了也只是补数据的事。

也可以单独起一个定时任务,周期性的去将这些失败存储的消息进行重发。如果你的MQ服务故障后几分钟就恢复了,那么重试的时候消息就能够成功发出去了。

下一篇聊一聊消费者手动ACK。

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

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

相关文章

机械师曙光16电脑开机自动蓝屏怎么解决?

机械师曙光16电脑开机自动蓝屏怎么解决?有的用户在使用机械师曙光16电脑的时候,遇到了一些系统问题,导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏,无法进行任何操作。那么这个情况怎么去进行问题的解决呢?来…

字节内部又推出最新spring进阶全家桶了!强烈建议人手一份!

前言 一份 Alibaba 内部强烈推荐的“玩转 Spring 全家桶的 PDF” ,小编也不是个吝啬的人,好的东西当然要一起分享咯。今天小编就带你一站通关 Spring全家桶,让你一路通关轻松斩获大厂 Offer! Spring 框架自 2002 年诞生以来一直…

如何真正开启docker远程访问2375

注意看官方文档 Configure remote access for Docker daemon | Docker Documentation 1. windows上Docker Desktop开启远程访问端口2375 系统版本: win10专业版 Docker Desktop版本:4.18.0 很简单勾上, 应用并重启即可 2. linux上开启 尝…

中兴通讯5G荣登《财富》2023年中国ESG影响力榜单

日前,《财富》正式对外公布“2023年中国ESG影响力榜单”,中兴通讯5G榜上有名,旨在表彰其在绿色发展、社会责任、公司治理方面做出的努力与贡献,值得一提的是,“中国ESG影响力榜单”是《财富》在去年创立的榜单&#xf…

怎么把ppt压缩到10m以内?

怎么把ppt压缩到10m以内?众所周知,压缩文件可以使得文件更加易于传输和存储。在PPT演示过程中,如果文件过大,可能会导致文件传输、下载或存储的速度变慢,影响用户使用体验。将PPT压缩到10M可以避免这种情况&#xff0c…

SY8205同步降压DCDC可调电源模块(原理图和PCB)

SY8205同步buck降压电源模块,输入电压4.5-30V,输出电压0.6-30V可调,效率90%以上,最大连续输出电流5A,峰值电流6A。 开源链接:https://url.zeruns.tech/obGu3 SY8025数据手册下载地址:https://…

【Go语言从入门到实战】面向对象编程篇

面向对象编程 Go语言的面向对象编程和其他语言有非常大的差别。 Go 是一种面向对象的语言吗? 是和不是。虽然 Go 有类型和方法,并允许面向对象的编程风格,但没有类型层次结构(继承)。Go 中的“接口”概念提供了一种不…

springboot+vue学生综合测评系统(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生综合测评系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

electron更新机制

说明: 本文适用于win和mac这两个端mac端若要调试更新功能, 一定要把旧版本和新版本都配置mac的代码签名, 至于怎么配置, 主要就是先成为苹果开发者,然后去帐号那边下一个证书, 然后..... 一. 在package.json配置更新参数 参考: Publish - electron-builder &quo…

六级备考23天|CET-6|翻译技巧5-2|2019年12月真题|翻译荷花lotus|11:05-12:05

目录 一、中文 句子1 PRACTICE ANSWER 句子2 PRACTICE ANSWER 句子3 ​ PRACTICE ANSWER 句子4 PRACTICE ANSWER 句子5 PRACTICE ANSWER 句子6 PRACTICE ANSWER ​ 答案整合​ 一、中文 句子1 荷花是中国的名花之一,深受人们喜爱。 PRACTICE Lotus is one…

使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)

目录 前言一、卸载node二、nvm是什么?三、nvm安装1. 官网下载 nvm 包2. 安装 nvm-setup.exe小tips 3. 配置路径和下载镜像4. 检查nvm是否安装完成 四、使用nvm安装node版本五、修改npm默认镜像源为淘宝镜像六、 环境变量配置1. 设置系统变量和用户变量的作用是什么呢…

led显示屏怎么连接电脑主机

要将LED显示屏连接到计算机主机,通常需要使用适当的接口和连接线。以下是常见的连接方法: HDMI接口:大多数现代计算机和LED显示屏都配备了HDMI接口。您可以使用HDMI连接线将计算机主机的HDMI输出端口连接到LED显示屏的HDMI输入端口。这种连接…

leetcode--环形链表.找到入环节点(java)

环形链表II 环形链表.找到入环节点题目描述解题思路 环形链表.找到入环节点 LeetCode 142:环形链表II 可以在这里测试 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节…

深度解析线程的正确停止方法

一、解惑 1. 什么情况下,线程需要被停止? 线程和任务被创建和启动之后,大部分情况下都是自然运行到结束的,自然停止,但有些情况会需要用到停止线程,如: 用户主动取消 服务被快速关闭 运行出…

【C++实现插入排序、希尔排序、冒泡排序、快速排序、选择排序】

使用C实现来插入排序、希尔排序、冒泡排序、快速排序、选择排序算法。 一、插入排序 插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好…

2023爱分析·中国面向开发者的低代码开发平台市场厂商评估报告

01 研究范围定义 “低代码”是一种可视化的应用开发方式,相对于传统编写代码的“纯代码”开发方式,低代码开发平台可以减少代码编写量或不使用代码编写进行应用的开发。随着技术革新,大模型也为低代码开发平台发展指明了新方向。从开发者与开…

单片机GD32F303RCT6 (Macos环境)开发 (二十八)—— 蓝牙透传模块HC-08 Android App开发

蓝牙透传模块HC-08 Android App开发 1、App整体开发思路 a、首先要申请权限,采用动态申请的方式,用户点击确认后方可操作蓝牙。 b、搜索蓝牙,之前的版本用startLeScan函数搜索蓝牙,虽然高版本中依然可用,但是google已…

什么时候该停止使用Scrum?

01、TL;DR:一个团队什么时候应该停止使用Scrum? 什么时候才能超越Scrum?毕竟许多类似思想、实践等事务迟早会过时;那为什么Scrum会是个例外?此外,我们不是通过实践Scrum来获得报酬,而是在既定的约束条件下解决客户的问题,同时又能为组织的…

( 链表) 707. 设计链表 ——【Leetcode每日一题】

❓707. 设计链表 难度:中等 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还…

ubuntu 安装ffmpeg

一、我的编译环境 ubuntu 22 ffmpeg 4.36 二、安装必要的依赖 sudo apt-get update sudo apt-get install -y \autoconf \automake \build-essential \cmake \git-core \libass-dev \libfreetype6-dev \libsdl2-dev \libtool \libva-dev \libvdpau-dev \libvorbis-dev \lib…