网站首页 > 技术文章 正文
这篇文章,给不太熟悉MQ技术的同学,介绍一个生产环境中可能会遇到的问题。
目前为止,你的RabbitMQ部署在线上服务器了,对吧?然后订单服务和仓储服务都可以基于RabbitMQ来收发消息,同时仓储服务宕机,不会导致消息丢失。
好,我们来看下目前为止的架构图。
那如果此时出现一个问题,就是说订单服务投递了订单消息到RabbitMQ里去,RabbitMQ暂时放在了自己的内存中,还没来得及投递给下游的仓储服务呢,此时RabbitMQ突然宕机了,会怎么样?
答案其实很简单,默认情况下,按照我们目前的代码和配置,这个数据就会丢失了。
所以在这里而言,就牵扯到了RabbitMQ的一个较为重要的概念:消息的持久化,用英文来说就是durable机制。
然后这里又有一个引申的概念,如果按照我们之前的代码和配置,默认情况下,RabbitMQ一旦宕机就再次重启,就会丢失我们之前创建的queue。所以首先得先让queue是持久化的。
使用下面的代码,就可以把我们的“warehouse_schedule_delivery”这个queue,也就是仓储调度发货的queue,设置为持久化的。
这样,即使RabbitMQ宕机后重启,也会恢复之前创建好的这个queue。
大家看到上面那行定义和创建queue的代码么?核心在于第二个参数,第二个参数是true。
他的意思就是说,这个创建的queue是durable的,也就是支持持久化的。
RabbitMQ会把这queue的相关信息持久化的存储到磁盘上去,这样RabbitMQ重启后,就可以恢复持久化的queue。
OK,现在你的queue的信息可以持久化了,RabbitMQ宕机重启后会自动恢复queue。但是,你的queue里的message数据呢? queue里都是订单服务发送过去的订单消息数据,如果RabbitMQ还没来得及投递queue里的订单消息到仓储服务,结果RabbitMQ就宕机了。
那此时RabbitMQ重启之后,他可以恢复queue的信息,但是queue的message数据是没法恢复了。 所以此时还有一个重要的点,就是在你的订单服务发送消息到RabbitMQ的时候,需要定义这条消息也是durable,即持久化的。
通过上面的方式来发送消息,就可以让发送出去的消息是持久化的。
一旦标记了消息是持久化之后,就会让RabbitMQ把消息持久化写入到磁盘上去,此时如果RabbitMQ还没投递数据到仓储服务,结果就突然宕机了。那么再次重启的时候,就会把磁盘上持久化的消息给加载出来。
整个过程,如下图所示:
但是这里要注意一点,RabbitMQ的消息持久化,是不承诺100%的消息不丢失的。
因为有可能RabbitMQ接收到了消息,但是还没来得及持久化到磁盘,他自己就宕机了,这个时候消息还是会丢失的。
如果要完全100%保证写入RabbitMQ的数据必须落地磁盘,不会丢失,需要依靠其他的机制。
------------- END -------------
扫码免费获取600+页石杉老师原创精品文章汇总PDF
原创技术文章汇总
- 上一篇: 非常强悍的 RabbitMQ 总结,写得真好
- 下一篇: 推荐 7 种机器学习模型加权集成方法
猜你喜欢
- 2024-09-24 非常强悍的 RabbitMQ 总结,写得真好
- 2024-09-24 「服务器」RabbitMQ入门教程——简介及工作原理
- 2024-09-24 在 WebApi 项目中快速开始使用 RabbitMQ
- 2024-09-24 RabbitMQ使用延迟插件,代码量直接降一半?
- 2024-09-24 RabbitMQ 高可用之镜像队列
- 2024-09-24 k8s上创建高可用RabbitMQ集群
- 2024-09-24 Centos7部署RabbitMQ的镜像队列集群
- 2024-09-24 docker分布式部署rabbitmq高可用集群
- 2024-09-24 详解如何用zabbix来监控rabbitmq消息队列服务
- 2024-09-24 rabbitMQ几种工作模式及策略分享
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)