V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

这篇文章,给不太熟悉MQ技术的同学,介绍一个生产环境中可能会遇到的问题。

目前为止,你的RabbitMQ部署在线上服务器了,对吧?然后订单服务和仓储服务都可以基于RabbitMQ来收发消息,同时仓储服务宕机,不会导致消息丢失。

好,我们来看下目前为止的架构图。

那如果此时出现一个问题,就是说订单服务投递了订单消息到RabbitMQ里去,RabbitMQ暂时放在了自己的内存中,还没来得及投递给下游的仓储服务呢,此时RabbitMQ突然宕机了,会怎么样?

答案其实很简单,默认情况下,按照我们目前的代码和配置,这个数据就会丢失了。

所以在这里而言,就牵扯到了RabbitMQ的一个较为重要的概念:消息的持久化,用英文来说就是durable机制。

然后这里又有一个引申的概念,如果按照我们之前的代码和配置,默认情况下,RabbitMQ一旦宕机就再次重启,就会丢失我们之前创建的queue。所以首先得先让queue是持久化的。

使用下面的代码,就可以把我们的“warehouse_schedule_delivery”这个queue,也就是仓储调度发货的queue,设置为持久化的。

这样,即使RabbitMQ宕机后重启,也会恢复之前创建好的这个queue。

channel.queueDeclare(

“warehouse_schedule_delivery”,

true,

false,

false,

null);

大家看到上面那行定义和创建queue的代码么?核心在于第二个参数,第二个参数是true。

他的意思就是说,这个创建的queue是durable的,也就是支持持久化的。

RabbitMQ会把这queue的相关信息持久化的存储到磁盘上去,这样RabbitMQ重启后,就可以恢复持久化的queue。

OK,现在你的queue的信息可以持久化了,RabbitMQ宕机重启后会自动恢复queue。但是,你的queue里的message数据呢?
queue里都是订单服务发送过去的订单消息数据,如果RabbitMQ还没来得及投递queue里的订单消息到仓储服务,结果RabbitMQ就宕机了。

那此时RabbitMQ重启之后,他可以恢复queue的信息,但是queue的message数据是没法恢复了。
所以此时还有一个重要的点,就是在你的订单服务发送消息到RabbitMQ的时候,需要定义这条消息也是durable,即持久化的。

channel.basicPublish(

 "", 

 "warehouse_schedule_delivery",

 MessageProperties.PERSISTENT_TEXT_PLAIN,

 message.getBytes());

通过上面的方式来发送消息,就可以让发送出去的消息是持久化的。

一旦标记了消息是持久化之后,就会让RabbitMQ把消息持久化写入到磁盘上去,此时如果RabbitMQ还没投递数据到仓储服务,结果就突然宕机了。那么再次重启的时候,就会把磁盘上持久化的消息给加载出来。

整个过程,如下图所示:

但是这里要注意一点,RabbitMQ的消息持久化,是不承诺100%的消息不丢失的。

因为有可能RabbitMQ接收到了消息,但是还没来得及持久化到磁盘,他自己就宕机了,这个时候消息还是会丢失的。

如果要完全100%保证写入RabbitMQ的数据必须落地磁盘,不会丢失,需要依靠其他的机制。

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

RabbitMQ宕机后,消息100%不会丢失吗相关推荐

  1. 慌得一逼,Kafka宕机后不再高可用?吓死宝宝了

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 来源:juejin.im/post/6874957625998606344 推荐 ...

  2. 头条二面:宕机后,Redis如何实现快速恢复?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Kaito 来源 | kaito-kidd.c ...

  3. MySQL MGR 宕机后如何开启复制

    MGR宕机后的重启,分两种情况 整个MGR集群宕机 1.首先将所有实例开启,例如 mysqld_safe --defaults-file=/etc/my.cnf1 --user=mysql & ...

  4. kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?

    一.介绍 我们搭建好kafka集群后,对其进行性能测试.遇到这种场景:我搭建好了三台kakfa集群,然后停掉其中一台kafka,然后集群是否能正常工作呢? kafka集群: 192.168.183.5 ...

  5. 04 | 内存快照:宕机后, Redis 如何实现快速恢复

    文章目录 1. RDB内存快照的局限性 2. 给哪些内存数据做快照 3. 快照时数据能修改吗 4. 可以每秒做一次快照吗 4. 数据快速恢复 Redis 一另一种种持久化方法:内存快照.所谓内存快照, ...

  6. 内存快照:宕机后,Redis如何实现快速恢复?

    上节课,我们学习了Redis避免数据丢失的AOF方法.这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大.一般而言,只要你采用的不是always的持久化策略,就不会对性能造成太大影响 ...

  7. 05 _ 内存快照:宕机后,Redis如何实现快速恢复?

    用AOF方法进行故障恢复的时候,需要逐一把操作日志都执行一遍.如果操作日志非常多,Redis就会恢复得很缓慢,影响到正常使用.这当然不是理想的结果.那么,还有没有既可以保证可靠性,还能在宕机时实现快速 ...

  8. Redis 内存快照:宕机后,Redis如何实现快速恢复?

    上节课,我们学习了 Redis 避免数据丢失的 AOF 方法.这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大.一般而言,只要你采用的不是 always 的持久化策略,就不会对性能 ...

  9. springboot整合redis集群master宕机后连接超时

    前提: #        本文是在确保redis集群配置正确的情况下,连接超时的解决方案. 项目登录认证使用的是sa-token(这个不重要,主要说的是springboot和redis集群),最近应甲 ...

最新文章

  1. 豪掷十亿拿下CUBA运营权,阿里体育未来也许并不轻松
  2. 由MAC地址在18字节及6字节之间的转换引发越界问题讨论
  3. 本期赠书中奖名单公布
  4. 大数据实训报告_2019公路货运大数据报告发布:运输结构持续优化 大数据优势愈发明显...
  5. 【转】了解SQL Server触发器及触发器中的事务
  6. 施一公的三位杰出女弟子
  7. “既生 ExecutorService, 何生 CompletionService?”
  8. 信息学奥赛一本通(1009:带余除法)
  9. 关于特殊的LCS问题的优化
  10. JAVA的cell设置行间距_iOS设置tableView的cell之间的间距
  11. mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞
  12. [转]C++操作oracle数据库
  13. iphone新旧手机数据传输已取消_iPhone 手机支付宝自动扣费?取消服务提示“无法解约”?...
  14. linux 安装 yum
  15. Eternal机器人指令大全
  16. ROS安装教程(详细)
  17. linux 编译cgal,Linux(Ubuntu)安装CGAL
  18. wtl单文档选项_[翻译]WTL开发者指南 第1章 WTL概述
  19. OA项目总结(附程序源码)
  20. 吃饭理论,抓沙理论,杯子理论——结构化学习,实现N+1,时间管理

热门文章

  1. 【科研故事】小王的故事(二)
  2. Revit快速标注 | 有求必应的【万能标注】操作步骤
  3. Labelme使用——数据集标注详解
  4. Python 调用动态链接库
  5. 厉害了,Python也能使用动态链接库
  6. 视频监控系统中的流媒体服务器、直写和全切换三种取流架构方案
  7. R语言 第三方软件包的下载及安装
  8. LeetCode50——一题学会快速幂算法
  9. 从软件工程师到IT猎头:说说跳槽那点事
  10. 数据结构考试的一些选择题