RabbitMQ 持久化

  通过持久化可以尽量防止在RabbitMQ异常情况下(重启、关闭、宕机)的数据丢失。持久化技术是解决消息存储到队列后的丢失问题,但是通过持久化并不能完全保证消息不丢失。

持久化

  持久化技术可以分为交换机持久化、队列持久化以及消息持久化,它们的实现方案和实现目的均不相同。

交换机持久化

  交换机持久化是为了确保用户创建的交换机在RabbitMQ重启后依旧存在的一种手段。

  交换机持久化在声明交换机过程中通过将durable参数设置为true实现。交换机持久化会将交换机元数据也进行持久化,当然也包含队列和路由的绑定关系。但如果绑定关系存在,队列不存在则消息依旧不会发送到队列中。

队列持久化

  队列持久化可以保障队列自身的元数据不会丢失,不能保证存储在队列中的消息不会丢失。

  队列持久化在声明队列的过程中通过将durable参数设置为true实现。需要注意的是,虽然队列持久化不能保证消息持久化,但是消息的持久化实现必须依赖于队列持久化,也就是说持久化消息只有存储于持久化队列中才会真正实现持久化。

消息持久化

  消息持久化确保了消息入队后到消息被消费这一过程中的稳定性,防止由于故障异常原因导致存储在队列中尚未被消费的消息丢失。

  消息持久化可以在发送消息的过程中将消息元数据deliveryMode设置为2实现。

  消息持久化虽然可以尽量保证队列中的消息不丢失,但是并不能完全确保队列中的消息不丢失,待消息入队后,通过持久化技术会将消息写入磁盘中,但是Linux操作系统底层并不会实时的把数据写入磁盘中,它会首先将需要写入磁盘的数据放入缓存区中,如果消息入队并且将数据写入缓存区尚未写入磁盘的过程中出现服务器异常,则消息依旧面临了丢失的情况。

  该问题可以通过发布确认机制进行解决。我们了解到发布确认机制其实本质上是确保消息合法的发送到rabbitMQ中的交换机中的,但是发送确认机制的应答时间是在消息完成持久化后,因此我们可以通过发送确认机制加持久化技术进一步确保消息在队列中被持久化且避免丢失。

总结

内容 交换机持久化 队列持久化 消息持久化
实现方式 声明交换机是定义 声明队列时定义 发送消息时定义
作用 持久化交换机的元数据,避免重启丢失 持久化队列的元数据,避免重启丢失 持久化消息
特点 队列持久化不能代表消息持久化,但是持久化消息只能在持久化队列中进行 消息持久化也可能会存储消息丢失的问题,可通过发送确认机制和RabbitMQ集群的方式进一步保障消息的安全性。
相关推荐
Smoothcloud润云9 小时前
GPU算力平台推荐:新手租GPU时,镜像环境和显存应该怎么选?
大数据·人工智能·pytorch·分布式·深度学习·gpu算力
程序员大阳11 小时前
副队长大数据教程(6)--四节点分布式集群搭建
大数据·分布式·集群·搭建·四节点
马六六i11 小时前
目前知名的分布式Ai数智共享商城哪家好
人工智能·分布式
大鹏说大话12 小时前
分布式事务怎么选型?2PC、TCC、SAGA、本地消息表一次讲清
分布式
Eloudy13 小时前
ASTRA-sim 3.0:通过高保真GPU和基础设施建模进行下一级分布式机器学习模拟
人工智能·分布式·机器学习
泡海椒14 小时前
JQuick-SQL 模块架构:从 SQL AST 到分布式执行
分布式·sql·架构
用户849137175471614 小时前
订单超时未支付自动取消实现方案 | 三种方案详解
redis·面试·rabbitmq
starzy199014 小时前
深度拆解 Kafka 源码:Producer 构造器装配了哪些核心组件
分布式·kafka
程序员大阳15 小时前
副队长大数据教程(7)--Hadoop 集群角色配置逻辑详解
大数据·hadoop·分布式·集群·配置·角色·逻辑
蓝胖的四次元口袋15 小时前
RabbitMQ知识梳理(2)
分布式·rabbitmq