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

bed032086aac6c996c1b8a2d4b1ddad3.png

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

032ffa9d30d83f16c0a149bdab0901d0.png

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

05f7053bb1bd59d9974e5de878faf1f1.png
56310d6691940c636a02a14189c503d5.png

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

2e364aa985f2c41d439f8da70b80e58d.png

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

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

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

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

dfa2523db754fb6d382d2e10b328febc.png

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

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

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

相关文章

大厂HR年底绷不住了:怎么招程序员这么难,尤其搞这项技术的!!

力与力之间的作用一定是相互的。当我们感觉找工作难的时候,其实企业和HR也在每天崩溃:“怎么招程序员这么难?”以Python程序员为例,很多大牛都能拿到10~20万的年薪,但是很多企业却根本招不到人,…

国内RISC-V产学研基地成立,Intel、Arm、RISC-V将三分天下?

作者 | 伍杏玲来源 | CSDN(ID:CSDNnews)在IT界,CPU芯片和操作系统是网信领域最基础的核心技术。但在芯片领域,技术和资本的门槛较高,应用范围最广的指令集架构需获得专利授权才能使用,如x86、Ar…

git设置mergetool可视化工具

文章目录1. 下载并安装BeyondCompar2. 设置git配置3. 配置git mergetool3. 添加暂存区4. 将暂存区文件提交到版本库5. 原则1. 下载并安装BeyondCompar 2. 设置git配置 打开 git bash 3. 配置git mergetool 依次执行以下命令即可 git config --global merge.tool bc4 git …

盘点丨2019十大边缘计算项目

来源 | 边缘计算社区(ID:edgewnet)5G和物联网让边缘计算备受瞩目,巨头们纷纷跑步入场,边缘计算项目百花齐放,参差不齐。边缘计算社区经过1个月收集,梳理了10个2019年表现优异的边缘计算开源项目、边缘计算框…

Navicat for MySQL中如何新建用户并赋予权限

文章目录1. 激活2. 新建用户3. 赋予权限1. 激活 打开Navicat for MySQL软件,打开连接并激活数据库 2. 新建用户 点击新建用户,输入用户名,输入主机名,输入密码,确认密码。 3. 赋予权限 点击服务器权限对其赋予…

十年云计算大爆发,微软正在摧毁其它竞争对手

作者 | Kelly Teal译者 | 陆离责编 | 徐威龙出品 | CSDN云计算(ID:CSDNcloud) 近日,Synergy Research做出了三份关于云计算的新行业研究报告,其中包括了一些可以帮助渠道合作伙伴建立相关业务的指导建议。报告指出&…

mysql pb_请详细的说一下怎样用pb连接mysql,好吗

展开全部第一步 当然是装驱动 不过开发环境装了 就要求客户机也要装 可以考虑INSTALLSHILED打包时 把MYSQL驱动环境带32313133353236313431303231363533e4b893e5b19e31333365653164进去 还有一个简单办法 EXE所在目录带上MYODBC3.DLL 就免驱动安装过程了 不过注册ODBC时 需要…

探秘 Dubbo 的度量统计基础设施 - Dubbo Metrics

对服务进行实时监控,了解服务当前的运行指标和健康状态,是微服务体系中不可或缺的环节。Metrics 作为微服务的重要组件,为服务的监控提供了全面的数据基础。近日,Dubbo Metrics 发布了2.0.1版本,本文将为您探秘 Dubbo …

VS在win32平台与mysql链接_visual C++如何与MySQL在windows下建立连接

展开全部#ifdef WIN32#include #include #include #else#include #include #define SQLHANDLE static MYSQL#endif#include #include #include #include SQLHANDLE hDBEnv, hDBC;int DB_Open(char * dbcn, char * usr, char * pwd){int r;#ifdef WIN32r SQLAllocHandle(SQL_HA…

利用Serverless Kubernetes和Kaniko快速自动化构建容器镜像

前言: 在云原生时代中,容器镜像是一切应用分发的基础载体,除了dockerhub作为流行的镜像仓库外,各大公有云厂商也都提供了功能丰富镜像仓库服务,如ACR(Aliyun Container Registry), GCR&#xf…

2020边缘计算状态报告:2028年企业IT基础设施边缘支出将达87亿美元

近日,知名市场研究机构State of the Edge发布了2020年最新的对边缘计算领域的研究报告——《边缘计算状态报告2020》(以下简称“报告”)。“边缘化”是指人或事物从中心和主流位置向“非中心”、“非主流”方向移动。而本次报告指出&#xff…

想提升微服务容错性?试试这5种模式

作者 | Igor Perikov译者 | 陆离责编 | 徐威龙出品 | CSDN云计算(ID:CSDNcloud) 在本文中,我将介绍微服务中的几种容错机制及其实现的方法。如果你在维基百科上查找“容错性”,你将会发现有如下的定义:“容…

21世纪了还愚公移山?数据库这么迁移更稳定!

背景 在系统的快速迭代过程中,业务系统往往部署在同一个物理库,没有做核心数据和非核心数据的物理隔离。随着数据量的扩大这种情况会带来稳定性的风险,如库的慢sql,磁盘,IO等等都会相互整体影响,从而影响核…

Oracle 创建表空间、用户、权限_(plsql)

背景:企业内部oracle数据库日常oracle表空间、用户、权限操作 文章目录1. 使用dba用户登录plsql2. 创建表空间3. 创建用户4. 赋予用户权限5. 验证6. 完整脚本1. 使用dba用户登录plsql 2. 创建表空间 -- 创建表空间设置表空间大小 CREATE TABLESPACE fisknow DATAFI…

2019五个最棒的机器学习课程

凭借强大的统计学基础,机器学习正在成为最有趣,节奏最快的计算机科学领域之一,目前已经有无穷无尽的行业和应用正在使用机器学习使它们更高效和智能。 聊天机器人、垃圾邮件过滤、广告投放、搜索引擎和欺诈检测是机器学习模型正在实际应用于…

“天河二号”总工程师杜云飞谈星光超算应用平台设计

整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】12 月 21-22 日,OpenI/O 启智开发者大会在深圳召开。在大会上, 国家超级计算广州中心总工程师、“天河二号”总工程师杜云飞发表了题为《星光超算应用平台》的主题报告&…

蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库

什么是 SOFAJRaft? SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。 使用 SOFAJRaft 你可以专注于自己的业务领域,由 SOFAJRaft 负责处理所有与 Raft 相关的技…

如何在mysql查询结果集中得到记录行号_获取MySQL查询结果集中记录行号的方法...

如果需要在查询语句返回的列中包括一列以指示整个结果集中记录的行号,则ISO SQL: 2003标准建议的方法是提供ROW_NUMBER()/ RANK()函数. Oracle可以使用标准方法(版本8i或更高版本)或非标准ROWNUM. MS SQL Server在2005版中提供了ROW_NUMBER()函数. 但是在MySQL中似乎…

开发者必看!探秘阿里云Hi购季开发者分会场:海量学习资源0元起!

2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段、3月04日-3月16日的新购满返5折抢购阶段、3月16日-3月31日的续费抽豪礼5折抢购阶段。 活动核心亮点:…

疫情严重,潜伏期也有传染性?科技公司在行动

整理 | 阿司匹林出品 | CSDN云计算新型冠状病毒的感染人数仍在不断增加。根据1月26日的最新数据,全国新型冠状病毒感染的肺炎确诊2005例,疑似2684例,死亡56例。据央视报道,国家卫生健康委员会主任马晓伟在国新办新闻发布会上表示&…