大茂名网

 找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 218|回复: 0

[【编导】] 新闻美团二面:如果每天有百亿流量,你如何保证数据一致性2022/12/26 15:40:02

[复制链接]

2万

主题

2万

帖子

9万

积分

钻石元老

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
98065
发表于 2022-12-26 15:39 | 显示全部楼层 |阅读模式

马上注册登陆,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?用户注册

x

简单来说,在一个复杂的系统中一定会对一些数据做出非常复杂的处理,而且可能是多个不同的子系统,甚至是多个服务。对一个数据按照一定的顺序依次做出复杂的业务逻辑的执行,比较终可能就会生产出一份宝贵的系统核心数据,落地到存储里去,比如说在数据库里存储。一、前情提示ip地址归属地查询的最新消息可以到我们平台网站了解一下,也可以咨询客服人员进行详细的解答!


这篇文章,咱们继续来聊聊之前的亿级流量架构的演进。老规矩!我们首先看一下这个复杂的系统架构演进到当前阶段,整体的架构图是什么样子的。

笔者再次友情提醒,如果各位小伙伴对下面这个复杂的架构图还有什么不理解的地方,一定要先回看之前的文章,因为系列文必须对上下文有清晰的理解和认识。



接着文本我们来聊聊一个核心系统每天承载百亿流量的背景下,应该如何来保证复杂系统中的数据一致性

二、什么是数据一致性简单来说,在一个复杂的系统中一定会对一些数据做出非常复杂的处理,而且可能是多个不同的子系统,甚至是多个服务。

对一个数据按照一定的顺序依次做出复杂的业务逻辑的执行,比较终可能就会生产出一份宝贵的系统核心数据,落地到存储里去,比如说在数据库里存储。

给大家来一张手绘彩图,感受下这个现场的氛围:



从上图中我们就可以看到,多个系统如何对一个数据依次进行处理,比较终拿到一份核心数据,并落地到存储里去。

那么在这个过程中,就可能会产生所谓的数据不一致的问题。

什么意思呢给大家举一个比较简单的例子,我们本来期望数据的变化过程是:数据1-数据2-数据3-数据4。

那么比较后落地到数据库里的应该是数据4,对不对

结果呢不知道为啥,经过上面那个复杂的分布式系统中的各个子系统,或者是各个服务的协作处理,比较后居然搞出来一个数据87。

搞了半天,搞了一个跟数据4风马牛不相及的一个东西,比较后落地到了数据库里。

然后啊,这套系统的比较终用户,可能通过前台的界面看到了一个莫其妙的数据87。

这就尴尬了,用户明显会觉得这个数据有错误,就会反馈给的客服,此时就会上报到工程师团队,大家就开始吭哧吭哧的找问题。

上面说的这个场景,其就是一种数据不一致的问题,也是我们接下来几篇文章要讨论的一个问题。

际上,在任何一个大规模分布式系统里,都会存在类似的问题。论是电商,O2O,还是本文举例的数据平台系统,都一样。

、一个数据计算链路的梳理那么既然已经明确了问题,接下来就来看看在数据平台这个系统里,到底是什么问题可能会导致一个比较终落地存储的数据的异常呢

要明白这个问题,咱们先回过头看看,在之前提过的数据平台这个项目里,一个比较终落地的数据的计算链路是什么样的

大家看看下面的图:



如上图所示,其从比较简单的一个角度来说,这个数据计算的链路大概也就是上面的那个样子。

首先,通过MSQL采集中间件获取到数据,转发给数据接入层。然后,数据接入层会把原始数据落地到存储里去接着,是时计算平台会从存储里提取数据进行计算比较后,会将计算结果写入到数据库+缓存的集群里。数据查询平台会从数据库+缓存的集群里提取数据,提供用户来进行查询看起来很简单,对吧

但是哪怕是这个系统里,数据计算链路,也绝对不是这么简单的。

如果大家看过之前的系列文章的话,就应该知道,这个系统为了支撑高并发、高可用、高性能等场景,引入了大量的复杂机制。

所以际上一条原始数据进入到系统,一直到比较后落地到存储里,计算链路还会包含下面的东西:

接入层的限流处理时计算层的失败重试时计算层的本地内存存储的降级机制数据分片的聚合与计算,单条数据在这里可能会进入一个数据分片里数据查询层的多级缓存机制上面只不过是随便列举了几条。然而哪怕只是上述几条,都可以把一个数据的计算链路变得复杂很多倍了。

四、数据计算链路的既然大家已经明白了,在一个复杂系统里,一份核心数据可能是经过一个极为复杂的计算链路的处理,中间百转千回,任何可能的情况都会发生。

那么就可以理解在大型分布式系统中,数据不一致的问题是如何产生的了。

其原因非常的简单,说白了,就是数据计算链路的。

也就是说,在数据的计算过程中,某个子系统出现了,并没有按照我们预期的行为去处理,导致比较终产出去的数据变得错误了。

那么,为什么会在数据计算链路中出现这种呢

原因很简单,如果大家曾经参与过上百人协作的大型分布式系统,或者是主导过上百人协作开发的大型分布式系统的架构设计,应该对核心数据的异常和错误非常熟悉,并且会感到头疼不已。

大规模分布式系统中,动辄上百人协作开发。很可能某个子系统或者是某个服务的负责人,对数据的处理逻辑理解偏差了,代码里写了一个隐藏的。

而这个,轻易不会触发,并且在QA测试环境还没测出来,结果带着一颗定时炸弹,系统上线。

比较后在线上某种特殊的场景下,触发了这个,导致比较终的数据出现问题。

五、电商库存数据的不一致问题接触过电商的同学,可能此时脑子里就可以速的想到一个类似的经典场景:电商中的库存。

在大规模的电商系统中,库存数据绝对是核心中的核心。但是际上,在一个分布式系统中,很多系统可能都会采用一定的逻辑来更新库存。

这就可能导致跟上述说的场景类似的问题,就是多个系统都更新库存,但就是某个系统对库存的更新出现了。

这可能是因为那个系统的负责人没理解到底应该如何更新库存,也或者是他更新的时候采用的逻辑,没有考虑到一些特殊情况。

这样导致的结果就是,系统里的库存和仓库中际的库存,死活对不上。但就是不知道到底哪个环节出了问题,导致库存数据出错。

这个,其就是一个典型的数据不一致的问题。

六、大型系统的数据不一致排查有多困难当面对一个大型分布式系统时,如果你之前压根儿没考虑过数据不一致的问题,那么我敢打,当你负责的系统在线上被客服反馈有某个核心数据不一致的时候,你绝对会一脸蒙圈。

因为一个核心数据的处理,少则涉及几个系统的协作处理,多则涉及十个以上的系统的协作处理。

如果你没有留存任何日志、或者仅仅就是有部分日志,然后基本就只能所有人干瞪眼,大家大眼对小眼,都盯着自己的代码看。

大家根据一个数据比较后的错误结果,比如数据87。10多个人对着自己的代码,反复的思考,冥思苦想。

然后每个人都在大脑中疯狂的模拟自己代码的运行,但是就是想不明白,为什么本来应该是数据4的,结果出来了一个数据87

所以现问题就是这样,这种数据不一致的问题,大概有以下几个痛点:

自己基本法主动提前感知到数据问题,要被动等待用户发现,反馈给客服,这很可能导致你的产品被大量投诉,老板很生气,后果很严重。

即使客服告诉了你数据错了,但是你们没法还原现场,没有留存证据,基本就是一群工程师对着代码想象,猜测。

即使你解决了一次数据不一致的问题,但是以后也许还有下一次,这样搞下去,会导致团队里好几个能干的小伙儿时间都搭在这种破事儿上。
爱上大茂名,喜当大猫友,吃喝玩乐事,天天乐开怀!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

QQ|客服:0668-2886677QQ:75281068|大茂微博|小黑屋|手机版|Archiver|大茂名网 ( 粤ICP备18149867号 )茂名市大茂科技有限公司 版权所有 

GMT+8, 2025-6-8 05:45 , Processed in 0.070241 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表