在应用开发中,持久化也是经常被提起的,持久化就是存在在内存当中的数据,要写入到磁盘中,这样在内存中的数据由于各种原因丢失掉后,可以通过磁盘重新加载到内存中来,对于消息中间件,持久化也至关重要。在生产者发布消息到broker后,消费者消费消息之前,消息是存在于内存当中,倘若消息丢失,那么就会造成消息的不一致性,这时就要对生产之后消费之前的消息做一下持久化操作。

RabbitMQ的持久化分为三个部分:交换器的持久化、队列的持久化和消息的持久化,而我们要关注的就是消息的持久化。但是消息是依附于队列而存在的,所以也要关注队列的持久化,倘若队列没有做持久化而丢失了,那么消息还能依附到哪里呢?但是队列的持久化能保证其本身的元数据不会因异常情况而丢失,但是并不能保证内部所存储的 消息不会丢失。要确保消息不会丢失,需要将其设置为持久化。通过将消息的投递模式 (BasicProperties中的deliveryMode属性)设置为2,即可实现消息的持久化。代码中消息投递时设置的MessageProperties.PERSISTENT_TEXT_PLAIN实际上是封装了这个属性:

设置了队列和消息的持久化,当RabbitMQ服务重启之后,消息依旧存在。单单只设置队 列持久化,重启之后消息会丢失;单单只设置消息的持久化,重启之后队列消失,继而消息也丢失。单单设置消息持久化而不设置队列的持久化显得毫无意义。这时要注意一个问题,如果将所有的消息都设为持久化,会严重影响RabbitMQ的性能。写入 磁盘的速度比写入内存的速度慢得不只一点点。所以对于可靠性不是那么高的消息可以不采用持久 化处理,以提高整体的吞吐量。在选择是否要将消息持久化时,需要在可靠性和吐吞量之间做一个权衡。

那么队列、消息都设置了持久化之后,就能百分百保证数据不丢失了吗?

在持久化的消息正确发送到RabbitMQ之后,还需要有一段时间(虽然很短〉才能存入磁盘之中。RabbitMQ并不会为每条消息都进行同步存盘的处理,可能仅仅保存到操作系统缓存之中而不是物理磁盘之中。如果在这段时间内RabbitMQ 服务节点发生了岩机、重启等异常情况,消息保存还没来得及落盘,那么这些消息将会丢失。所以针对上面那个问题,答案是否定的。

对于这种问题的出现,需要保证RabbitMQ的高可用,来增加RabbitMQ的可靠性,也就是要引入RabbitMQ的镜像队列机制,进行主从配置,如果主节点master 在此特殊时间内挂掉,可以自动切换到从节点slave, 这样有效地保证了高可用性,除非整个集群都挂掉。虽然这样也不能完全保证RabbitMQ消息 不丢失,但是配置了镜像队列要比没有配置镜像队列的可靠性要高很多,在实际生产环境中的关键业务队列一般都会设置镜像队列。

还有一点就是消费者消费消息,如果在订阅消费队列时将autoAck参数设置为true,那么当消费者接 收到相关消息之后,还没来得及处理就看机了,这样也算数据丢失。这种情况很好解决,将autoAck参数设置为false,并进行手动确认,这点和生产者投递消息保证一致性的处理机制,有着异曲同工之妙,就不再赘述了!

这样的保证消息一致性的解决方案,完全是靠着RabbitMQ的自身机制来解决的,然而这样的机制并不能保证消息百分之一百的不丢失,只是对于RabbitMQ来说已经尽力了,因为此时这样的消息系统,已经接近保证消息的一致性了,要想再更一步的百分百的保证,还要借助于外力来解决,具体要借助于怎样的外力,那么就要靠大家集思广益了!原谅我的能力不足!

保证一致性吗_RabbitMQ消息一致性:重要消息,请设置持久化相关推荐

  1. rocketmq怎么保证消息一致性_从入门到入土(三)RocketMQ 怎么保证的消息不丢失?...

    精彩推荐 一百期Java面试题汇总SpringBoot内容聚合IntelliJ IDEA内容聚合Mybatis内容聚合 接上一篇:RocketMQ入门到入土(二)事务消息&顺序消息 面试官常常 ...

  2. rocketmq怎么保证消息一致性_如何保证消息队列的高可用和幂等性以及数据丢失,顺序一致性...

    (1)RabbitMQ的高可用性 RabbitMQ是比较有代表性的,因为是基于主从做高可用性的,我们就以他为例子讲解第一种MQ的高可用性怎么实现. rabbitmq有三种模式:单机模式,普通集群模式, ...

  3. wsasend发送不可靠_架构师总结:kafka 如何保证数据的可靠性和一致性

    Kafka 作为一个商业级消息中间件,消息可靠性的重要性可想而知.本文从 Producter 往 Broker 发送消息.Topic 分区副本以及 Leader 选举几个角度介绍数据的可靠性. Pro ...

  4. 使用MQ来保证分布式事务的最终一致性

    使用MQ来保证分布式事务的最终一致性 使用MQ来保证分布式事务的最终一致性 参考URL:https://www.bbsmax.com/A/obzbM9QVdE/ 生产者的逻辑 1.订单入库 2.消息记 ...

  5. 数据库怎么保证(分布式)事务一致性

    浅谈事务与一致性问题 原文地址 https://www.jianshu.com/p/f0a1b00a6002 在高并发场景下,分布式储存和处理已经是常用手段.但分布式的结构势必会带来"不一致 ...

  6. 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...

    大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...

  7. rabbitmq接收不到消息_分布式消息队列:如何保证消息的可靠性传输

    rabbitmq (1)生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能. 此时可以选择用rabbitmq提供的事务功能,就是生产者发送 ...

  8. mysql缓存一致性,缓存与数据库一致性保证

    全是干货!本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 当数据发生变化时,"先淘汰缓存,再修改 ...

  9. 有谁知道银行的跨行转帐是怎么保证交易的原子性和一致性?

    最近在看<Java Transaction Design Strategies>,想到了对事务要求比较严格的银行间转帐这种事务,夸行转帐是怎么保证事务的原子性和一致性呢?首先我能想到的就是 ...

最新文章

  1. 微软10亿美元投资的OpenAI如何组织员工学习新知识?这里有一份课程与书籍清单...
  2. 再学 GDI+[83]: TGPImage(3) - 平行四边形变换
  3. openlayers 可以实现3d地图效果吗_OpenLayers教程:图形绘制之设置图形的样式
  4. 浅谈HSRP(热备份路由选择协议)
  5. qt creator源码全方面分析(3-1)
  6. linux 查找文件 mysql数据库_Linux下MySQL数据库目录多了好多文件
  7. 【python】详解zipfile模块读取处理压缩文件实例
  8. == 与 equals 的区别
  9. 英语面试:应聘原因篇(转)
  10. mysql修改校对集_mysql数据库的基本操作(增删改查、字符集、校对集)
  11. 阿里巴巴一件代发怎么下单
  12. dropout层加在哪里_Nomaomi
  13. DB_RECOVERY_FILE_DEST,LOG_ARCHIVE_DEST,LOG_ARCHIVE_DEST_N
  14. Linux PXE无盘工作站
  15. LabVIEW学习分享(2)
  16. python c++情侣网名是什么意思_网友:c++与Python,究竟谁才是大哥?
  17. Python PEP—Python增强提案
  18. C语言用if语句判断规定字符串
  19. 概率公理化定义的理解
  20. 信奥一本通1023(大象喝水查)配详解

热门文章

  1. 【转载保存】Jsoup解析html常用方法
  2. Unity3d访问数据库
  3. Auto-Keras与AutoML:入门指南
  4. DT时代下 数据库灾备的探索与实践
  5. 阿里云DTS大幅降价,低至400元即可获得实现秒级延迟的数据传输服务
  6. 自动替换 Kubernetes 镜像
  7. 刷爆了!李彦宏:这类程序员我给100万!你怎么看?
  8. 5G精华问答:5G的速度到底有多快?| 技术头条
  9. uni app input添加获取验证码按钮_uni-app跨平台框架对微信小程序的无障碍支持探索...
  10. matlab from有什么用,Matlab函数使用'fromworkspace'将向量传递给simulink