当RabbitMQ服务器挂了,它可能就丢失所有队列中的消息和任务。如果你想让RabbitMQ记住当前的状态和内容,就需要通过2件事来确保消息和任务不会丢失:同时将queue和messages标识为durable。

设置了队列和消息的持久化之后,当broker服务重启的之后,消息依旧存在。单只设置队列持久化,重启之后消息会丢失;单只设置消息的持久化,重启之后队列消失,既而消息也丢失。单单设置消息持久化而不设置队列的持久化显得毫无意义。

注意:已经定义的队列,再次定义是无效的!(RabbitMQ不允许重新定义一个已有的队列信息,也就是说不允许修改已经存在的队列的参数。如果你非要这样做,只会返回异常。咋整?

一个快速有效的方法就是重新声明另一个名称的队列,不过这需要修改生产者和消费者的代码,所以,在开发时,最好是将队列名称放到配置文件中。

这时,即使RabbitMQ服务器重启,新队列中的消息也不会丢失。)

消息在正确存入RabbitMQ之后,还需要有一段时间(这个时间很短,但不可忽视)才能存入磁盘之中,RabbitMQ并不是为每条消息都做fsync的处理,可能仅仅保存到cache中而不是物理磁盘上,在这段时间内RabbitMQ broker发生crash, 消息保存到cache但是还没来得及落盘,那么这些消息将会丢失。那么这个怎么解决呢?首先可以引入RabbitMQ的mirrored-queue即镜像队列,这个相当于配置了副本,当master在此特殊时间内crash掉,可以自动切换到slave,这样有效的保障了HA, 除非整个集群都挂掉,这样也不能完全的100%保障RabbitMQ不丢消息,但比没有mirrored-queue的要好很多,很多现实生产环境下都是配置了mirrored-queue的。还有要在producer引入事务机制或者Confirm机制来确保消息已经正确的发送至broker端。

RabbitMQ的可靠性涉及producer端的确认机制、broker端的镜像队列的配置以及consumer端的确认机制,要想确保消息的可靠性越高,那么性能也会随之而降,鱼和熊掌不可兼得,关键在于选择和取舍。

标记为持久化后的消息也不能完全保证不会丢失。虽然已经告诉RabbitMQ消息要保存到磁盘上,但是理论上,RabbitMQ已经接收到生产者的消息,但是还没有来得及保存到磁盘上,服务器就挂了(比如机房断电),那么重启后,RabbitMQ中的这条未及时保存的消息就会丢失。因为RabbitMQ不做实时立即的磁盘同步(fsync)。这种情况下,对于持久化要求不是特别高的简单任务队列来说,还是可以满足的。如果需要更强大的保证,那么你可以考虑使用生产者确认反馈机制。

RabbitMQ消息存储在间隔(几百毫秒)后或者当一个队列处于空闲状态时,将消息持久化到磁盘,以最大限度地减少fsync(2)调用的次数。

持久(persistent)和临时(transient)消息都可以写入磁盘。持久性消息一旦到达队列就会被写入磁盘,而临时消息只会在内存压力下将其从内存中逐出时写入磁盘。

“持久层”(persistence layer)指的是用于将两种类型的消息存储到磁盘的机制。

持久层有两个组件:队列索引(queue index)和消息存储(message store)。

队列索引负责维护关于给定消息在队列中的位置信息,以及它是否已被传递和确认。因此每个队列都有一个队列索引。

消息存储是消息的键值存储,由服务器中的所有队列共享。消息可以直接存储在队列索引中,也可以写入消息存储库。技术上分为两个消息存储器(一个用于临时,一个用于持久消息),但它们通常一起被称做“消息存储”。

内存开销:

每个队列为每个未确认的消息维护一些元数据。如果消息的目标是消息存储,则消息本身可以从内存中删除。

消息存储需要一个索引。默认消息存储索引对存储库中的每条消息使用少量内存。

将非常小的消息作为优化存储在queue index中,而将所有其他消息写入message store。(默认情况下,序列化大小小于4096字节(包括属性和标题)的消息存储在queue index中。)

RabbitMQ消息持久化相关推荐

  1. RabbitMQ 入门系列(10)— RabbitMQ 消息持久化、不丢失消息

    消息要保持"持久化",即不丢失,必须要使得消息.交换器.队列,必须全部 "持久化". 1. 生产者怎么确认 RabbitMQ 已经收到了消息? # 打开通道的确 ...

  2. RabbitMQ消息持久化处理

    我们来看一下RabbitMQ的消息处理,我们先来看第一个知识点,关于RabbitMQ持久化的消息处理,消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息的可靠性的呢,就是靠他 ...

  3. rabbitmq消息持久化,避免异常情况下,消息会丢失

    2019独角兽企业重金招聘Python工程师标准>>> 1) 使用python包amqp from amqp.basic_message import Message from am ...

  4. rabbitmq 持久化_RabbitMQ原理与相关操作(三)消息持久化

    现在聊一下RabbitMQ消息持久化: 问题及方案描述 1.当有多个消费者同时收取消息,且每个消费者在接收消息的同时,还要处理其它的事情,且会消耗很长的时间.在此过程中可能会出现一些意外,比如消息接收 ...

  5. rabbitmq 同步策略_RabbitMQ(三):消息持久化策略

    一.前言 在正常的服务器运行过程中,时常会面临服务器宕机重启的情况,那么我们的消息此时会如何呢?很不幸的事情就是,我们的消息可能会消失,这肯定不是我们希望见到的结果.所以我们希望AMQP服务器崩溃了也 ...

  6. RabbitMQ之消息持久化

    消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢--消息持久化. 为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exch ...

  7. RabbitMQ 队列消息持久化

    参考链接: https://www.cnblogs.com/Keep-Ambition/p/8044752.html 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时 ...

  8. rabbitmq消息队列,消息发送失败,消息持久化,消费者处理失败相关

    转:https://blog.csdn.net/u014373554/article/details/92686063 项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败. ...

  9. RabbitMQ消息队列,发送消息失败、消息持久化、消费者失败处理方法和发送消息

    项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败.消息持久化.消费者失败处理方法和发送消息解决方法及手动确认的模式 先引入pom.xml <!--rabbitmq- ...

最新文章

  1. java基础---设计一个死锁
  2. vue使用webPack打包发布后页面显示空白
  3. Java案例:Karel学习Java
  4. SQL Server 连接字符串
  5. react-native与原生三种交互模式
  6. 当浏览器版本过低时提示升级浏览器
  7. 煤炭行业供应链集采系统:数字化推进煤炭产业转型升级
  8. 移动端网页、公众号兼容性问题记录
  9. Rust的crate
  10. 验证账号的服务器失败是怎么回事,服务器安全验证失败怎么回事
  11. 运行web项目提示异常:non-compatible bean definition of same name and class【com.xxx.xxx.XXX】
  12. iOS的电量测试(Sysdiagnose)
  13. Linux简介,linux终端符号含义
  14. 如何查看Eclipse是32位还是64位?
  15. 尚筹网-前台-会员系统(springboot,springcloud 实战)
  16. Teigha4.0加载显示Dwg文件
  17. 一个实战案例带你走完python数据分析全流程:豆瓣电影评论的关键词云图制作
  18. JS 计算年龄为几岁几月几天
  19. vue-cli模拟后台数据交互
  20. 计算机应用基础excel数据,《计算机应用基础》excel操作练习题集

热门文章

  1. drupal安装详解
  2. JS中的位置和宽度:clientWidth、offsetWidth、scrollWidth等区别
  3. 德鲁伊Java_德鲁伊聚合函数
  4. (官网)虚幻3--Scaleform 技术指南
  5. 30 岁,还好,还在 Coding,不卷了
  6. CSS3实现绚丽的图片切换效果
  7. 清明节如何实现网站变灰
  8. js将数组中对象某个值相同的去重合并到一起(利用indexOf去重相同名)
  9. Oracle Flashback 详解
  10. java ioc是什么意思_Java技术面试题解析:举例说明什么是IoC