中大型互联网公司如何保证数据不能丢失?-八维教育

优采云 发布时间: 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部分

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线