中大型互联网公司如何保证数据不能丢失?-八维教育
优采云 发布时间: 2021-08-19 18:30中大型互联网公司如何保证数据不能丢失?-八维教育
背景介绍
在这个文章中,我们来谈谈在线生产环境中使用消息中间件技术时,如何保证数据从前到后不会丢失。
这个问题在面试互联网公司的时候经常出现,也是一个很现实的生产环境问题。
如果你的简历写的是熟悉MQ技术(RabbitMQ、RocketMQ、Kafka),并且有在项目中使用的经验,那么一个非常实际的生产环境问题就是:post消息到MQ,然后从MQ消费消息处理过程中,数据会不会丢失?
这时候面试官会问:如果数据会丢失,你用什么手段保证在你项目的生产和部署过程中基于MQ传输的数据100%不会丢失?请与您在线使用的消息传递中间件详细讨论您的技术方案。
这其实是一个很能区分面试候选人技能水平的问题。
事实上,相当大比例的普通工程师,即使在一些中小型互联网公司工作过,也只是简单地使用公司部署的MQ集群。也许代码层面基本上就是发送和消费消息。 ,基本上没有考虑太多技术方案。
但实际上,在使用MQ、缓存、分库分表、NoSQL、中间件等各种技术时,会出现一堆与相应技术相关的生产环境问题。
对于这些问题,必须有一套相应的技术解决方案来保证系统的健壮性、稳定性和高可用性。
所以实际上,大中型互联网公司的面试官在面试应聘者的时候,如果考察他们对MQ相关技术的经验和掌握程度,几乎都会提出使用MQ肯定会涉及到的数据丢失问题由于这个问题,可以很好地区分候选人的技术水平。
那么这个文章,我们就在可能的基于RabbitMQ的消息中间件的上下文中,具体说说从向MQ传递消息到从MQ消费消息的过程中数据丢失的风险。
那我们一起来看看,如何结合MQ本身提供的一些技术特性来保证数据不丢失?
回顾以往情况
首先提醒大家,有些新同学可能对MQ相关技术了解不多。建议看看之前的MQ系列文章看看MQ的基本用法和原理:
另外,其实在讨论消息中间件不丢失数据的问题之前,我们已经有两个文章了。
我们从消费者突然宕机导致数据丢失、集群突然崩溃数据丢失等角度讨论了如何防止数据丢失。
只有这两种方案并不能保证全链接数据不会丢失,但是如果您还没有阅读建议,请先回顾一下:
总之,希望不熟悉MQ的同学能熟悉之前的系列文章,然后一起来系统的学习MQ数据如何做到100%不丢失。
现有技术方案
经过前面几次文章的讨论,我们初步知道,第一个导致数据丢失的地方就是消费者收到消息后,来不及处理,直接往下走。
此时RabbitMQ的自动ack机制会通知MQ集群消息已经处理完毕,MQ集群会删除该消息。
那么这个消息就丢失了?没有消费者将再处理此消息。
所以我们之前详细讨论过,通过调整消费者服务中的手动ack机制,确保消息必须已经被成功处理,然后才会将ack通知发送到MQ集群。
否则,在发送 ack 之前消费者服务已关闭。这时候MQ集群会自动检测,然后重新发送消息给其他消费者服务实例。
这个文章 详细讨论了这个问题。手动ack机制下的架构图如下:
除了这个数据丢失问题,还有一个问题,就是如果MQ集群本身突然宕机,会不会造成数据丢失?
默认肯定是可以的,因为队列和消息不是持久化的,所以重启MQ集群会导致部分数据丢失。
所以在这个文章中,我们分析了如何使用持久化创建队列,同时使用持久化将消息传递到MQ集群,让MQ集群将消息持久化到磁盘。
此时如果消息没有及时投递给消费者服务,然后MQ集群突然宕机,数据不会丢失,因为MQ集群会自动从磁盘加载未投递的消息重启后文件。然后继续交付给消费者服务。
同理,方案沉淀的系统架构图如下:
100% 的数据不会丢失吗?
大家想一想。到目前为止,我们的架构必须能够确保数据不丢失吗?
其实就目前的架构来说,还是存在数据可能丢失的问题。
即上面的订单服务作为生产者将消息投递到MQ集群后,暂时还驻留在MQ的内存中,还没来得及持久化到磁盘,也没有是时候将其交付给消费者了。仓储服务。
如果此时MQ集群本身突然宕机怎么办?
尴尬,驻留在内存中的数据肯定会丢失。我们来看下图。
按需开发技术解决方案
现在我们需要考虑的技术方案是:订单服务如何保证消息必须持久化到磁盘?
实际上,订单服务作为生产者在向MQ集群下发消息的过程中很容易丢失数据。
比如网络有问题,数据根本没有传输出去,或者上面提到的消息刚刚被MQ接收到但仍然驻留在内存中,没有登陆磁盘。这时候MQ集群宕机了。会丢失数据。
所以首先我们要考虑如何利用RabbitMQ提供的相关功能来实现一个作为生产者订单服务的技术方案。
该技术方案需要保证,只要订单服务发送的消息确认成功,此时MQ集群一定已经将消息持久化到磁盘。
一定要达到这样的效果,才能保证下发到MQ集群的数据不会丢失。
有待研究的技术细节
这里我们需要研究的技术细节是:仓储服务手动ack的实现原理,保证数据不丢失。
之前,笔者收到了很多同学的提问:
这些东西背后的实现原则和底层细节是什么?
大家保持冷静。接下来,我们将通过一系列文章来仔细探究这背后的原理。
网络面试必杀:如何保证消息中间件的全链接数据100%不丢失:第2部分
网络面试必杀:如何保证消息中间件的整个链接数据100%不丢失:第3部分
网络面试必杀:如何保证消息中间件的整个链接数据100%不丢失:第4部分