RabbitMQ消息持久化机制

news/2024/7/5 3:33:06

上一篇说到生产者消息确认机制,它可以确保消息投递到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://lihuaxi.xjx100.cn/news/1172444.html

相关文章

15 个非常流行的VsCode插件,让你的编码效率倍增!

VS Code已经成为了最受欢迎的代码编辑器之一。 它的简洁性、易用性和可扩展性使得它成为了许多开发者的首选。 而在VS Code中,插件是其最大的卖点之一。 通过安装插件,你可以将VS Code打造成一个功能强大的开发环境,从而提高你的编码效率。…

Task类的学习

一、Task启动 1、Task类在System.Threading.Tasks命名空间下面 2、开始一个Task最简单的方法是Task.Run(.net 4.5,4.0的时候是Task.Factory.StartNew). 3、使用方法是传入一个委托即可。 4、Task默认使用线程池,也就是后台线程。当主线程结束时,创建的所…

「实在RPA·金融数字员工」为风险防范摁下快捷键实在智能RPA实在智能RPA​

2023年度政府工作报告提出,要大力发展数字经济,提升常态化监管水平,支持平台经济发展,完善金融体制改革,加强金融风险防范。在国家政策的有力支持下,金融行业的数字化转型正如火如荼进行中。 一、金融业数…

CentOS系统如何开展爬虫工作

CentOS 系统可以用于进行爬虫工作。实际上,很多大型网站和在线服务都运行在 Linux 系统下,包括 CentOS、Ubuntu、Debian 等,因此 CentOS 系统也常用于进行爬虫工作。 在CentOS系统上开展爬虫工作,可以按照以下步骤进行&#xff1a…

基于LLMs的多模态大模型(Flamingo, BLIP-2,KOSMOS-1,ScienceQA)

前一篇博客已经整理了不训练视觉模型的文章们: 基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC) 本篇文章将介绍一些需要训练视觉编码器来适配多模态大模型的工作们,这也是目前最…

Unity中的InitializeOnLoadMethod

Unity中的InitializeOnLoadMethod特性:深入解析与实践 在Unity开发过程中,我们经常需要在编辑器启动时执行一些操作,例如初始化数据、注册事件等。这时,我们可以使用InitializeOnLoadMethod特性来实现这一需求。本文将详细介绍In…

YOLOv5、YOLOv7改进最新论文CFNet:即插即用|原创改进结构显著提升检测性能,小目标检测涨点必备(一)

💡本篇内容:YOLOv5|YOLOv7改进最新论文CFNet:即插即用|首发改进显著提升检测性能,小目标检测涨点必备 重点:🔥🔥🔥YOLOv5|YOLOv7|YOLOv8 使用这个 核心创新点 在数据集改进做实验:即插即用: 当 CFNet 遇到 YOLO 系列 💡🚀🚀🚀本博客 YOLO系列 + 改…

Spring支持哪些Aware接口?

Spring支持哪些Aware接口? Spring支持哪些Aware接口?Aware接口的优点ApplicationContextAware和BeanFactoryAware的区别 Spring支持哪些Aware接口? ApplicationContextAware:获取ApplicationContext对象BeanFactoryAware:获取BeanFactory对象BeanNameAware:获取Bean的名称E…