【架构设计面试精讲系列】- CAP 有关的分布式理论

大家好,我是贺同学。

之前分享过两篇文章,https://t.zsxq.com/10FH6CKdJhttps://t.zsxq.com/10mfDMWnx


今天继续给大家分享


在互联网技术面试中,考察分布式技术已经是面试的标配了。打开各种大厂面试 JD,一线互联网公司在对候选人的要求中都有“分布式系统设计”这一关键词。


无论你是程序员,还是架构师,都应该学习了解下分布式系统设计。今天的分享,我们就先来看一看怎么回答分布式的基础理论相关的知识,有的放矢,祝你面试一臂之力!



案例背景


CAP 理论是分布式系统中最核心的基础理论,虽然在面试中,面试官不会直白地问你 CAP 理论的原理,但是在面试中遇到的分布式系统设计问题,都绕不开你对 CAP 的理解和思考。


而且在面试中,针对面试不同岗位的候选者,面试官的要求也会不一样,要求你回答的深度也不一样。所以在这一讲中,针对初中级研发工程师高级研发工程师两个不同的角度,分析面试思路。



案例分析


CAP 理论


CAP理论最早发表于2000年,由加州伯克利的教授首先在ACM PODC会议上提出猜想,两年之后,被麻省理工学院的教授Seth Gilbert和Nancy Lynch从理论上证明。从此之后,它成了分布式系统领域的公认定理。


【1】C(Consistency)是数据一致性

【2】A(Availability)是服务可用性

【3】P(Partition tolerance)是分区容错性。


需要注意的是:C、A、P 只能同时满足两个目标,而由于在分布式系统中,P 是必须要保留的,所以要在 C 和 A 间进行取舍。假如要保证服务的可用性,就选择 AP 模型,而要保证一致性的话,就选择 CP 模型。


【1】C(Consistency)数据一致性


分布式系统当中的一致性指的是所有节点的数据一致,或者说是所有副本的数据一致。用英文描述是:All the nodes see the same data at the same time。它和数据库事务中的一致性是两码事。


我们可以将一致性一分为二,分别从客户端和服务端进行探究。对于客户端而言,并不关心后端的实现,也不关心后端的节点运行情况。唯一只关心多次并发访问下都能获得准确的符合预期的结果比如用户多次点击付款,也只会付款一次,余额无论什么时候查询都是当下最新的值。


而服务端关心的是会引发数据变更的请求过来,能够及时准确地同步到所有的节点和副本,并且考虑可能会出现的网络以及通信问题,保证极端情况下依旧不会产生错误。


【2】A(Availability)是服务可用性

可用性指的是:Reads and writes always succeed. 也就是说系统一直可用,而且服务一直保持正常。


一个高可用性的分布式系统,必须对用户的每一个请求做出响应。不可以出现无法访问或者是响应超时等影响用户体验的情况。在一个分布式系统当中,任何一个节点的不稳定,都有可能影响系统的可用性,比如数据库服务器、负载均衡,web服务器承载等等。为了量化系统的可用性,我们通常使用系统停机时间这个指标。即在一年时间内,系统停机的总时长。


【3】P(Partition tolerance)是分区容错性

分区容错性指的是: System continues operating despire arbitrary message loss or failure of part of the system. 翻译过来就是说系统在遇到一些节点或者网络分区故障的时候,仍然能够提供满足一致性和可用性的服务。


在面试中遇到理论问题时,单纯做浮于表面的概念性阐述,很难向面试官证明你的技术能力。 面试官会觉得你是一个刚接触分布式系统,或者对分布式系统理解不够深入的研发,如果这恰好是你第一个面试题,会直接影响面试官对你的第一印象,甚至影响你的定级。


如果你想答得更好,你需要先掌握 CAP 的原理、实践经验、技术认知,然后再结合具体的面试题具体分析。



问题解答


现在有一个分布式系统 A,它有一个副本 A1,在正常情况下,客户端 Client 写数据到系统 A,然后数据从 A 节点同步到 A1 节点,再返回给 Client 成功状态。

这时,客户端 Client 从任何节点 A 或 A1 读取数据,都能读取到最新写入的数据,说明 A 和 A1 的数据是一致的,并且 A 和 A1 也都是可用的。

但由于网络是不可靠的,节点 A 和 A1 的网络随时会因为中断而出现分区。所谓网络分区就是由于网络不通导致节点 A 和 A1 被隔离在不同的网络子集中,此时节点 A 的数据就不能及时同步到节点 A1 中了。


在分布式系统中,由于网络问题导致的网络分区是常态。也就是说出现网络分区时,根据 CAP 理论,需要在 A 和 C 中进行取舍,即要么保证系统的可用性,要么保证数据一致性。


这里需要注意了,这里给的例子有个大前提,就是系统出现了网络分区,但实际情况是,在绝大多数时间里并不存在网络分区(网络不会经常出现问题)。那么还要进行三选二吗(CP 或者 AP)?


其实,不同的分布式系统要根据业务场景和业务需求在 CAP 三者中进行权衡。CAP 理论用于指导在系统设计时需要衡量的因素,而非进行绝对地选择


当网络没有出现分区时,CAP 理论并没有给出衡量 A 和 C 的因素,但如果你做过实际的分布式系统设计,一定会发现系统数据同步的时延(Latency),即例子中节点 A 同步数据到节点 A1 的时间才是衡量 A 和 C 最重要的因素,此时就不会有绝对的 AP 模型还是 CP 模型了,而是源于对实际业务场景的综合考量。


因此,才会有如 PACELC 这样的新模型优化原有的 CAP 理论,理论指导实践,实践优化理论。


根据 PACELC 模型的定义,如果有网络分区产生,系统就必须在 A 和 C 之间取得平衡,否则(Else,即 PACELC 中的 E)当系统运行在无网络分区情况下,系统需要在 L(延迟)和 C 之间取得平衡。


但理解到这个程度还不够,你还需要结合落地经验进行证明。


实践经验


需要意识到,互联网分布式的设计方案是数据一致性和系统可用性的权衡,并不是非此即彼的。


所以即使无法做到强一致性(简单来讲强一致性就是在任何时刻所有的用户查询到的数据都是最新的),也可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。


这时就要引出 BASE 理论,它是 CAP 理论的延伸。BASE 是 Basically Available(基本可用)、Soft State(软状态)和 Eventually Consistent(最终一致性)三个单词的简写,作用是保证系统的可用性,然后通过最终一致性来代替强一致性,它是目前分布式系统设计中最具指导意义的经验总结。那么在实际项目中,你如何通过 BASE 理论来指导设计实践呢?


BASE 中的基本可用指的是保障核心功能的基本可用,其实是做了“可用性”方面的妥协,比如:


  1. 电商网站在双十一大促等访问压力较大的时候,关闭商品排行榜等次要功能的展示,从而保证商品交易主流程的可用性,这也是我们常说的服务降级;
  2. 为了错开双十一高峰期,电商网站会将预售商品的支付时间延后十到二十分钟,这就是流量削峰
  3. 在你抢购商品的时候,往往会在队列中等待处理,这也是常用的延迟队列


软状态和最终一致性指的是允许系统中的数据存在中间状态,这同样是为了系统可用性而牺牲一段时间窗内的数据一致性,从而保证最终的数据一致性的做法。


目前这种处理数据的方式几乎成了互联网的标配设计模式,最经典的例子是在用户下单的时候不需要真正地扣减库存,而是仅在前台计个数,然后通过异步任务在后台批量处理。



技术认知


如果你应聘的是高级研发工程师或架构师,在回答时,还要尽可能地展示知识体系和技术判断力,这是这两个岗位的基本素质。 因为分布式技术错综复杂,各种技术又相互耦合,在面试中,如果你能通过一个 CAP 理论的知识点,扩展出一个脉络清晰的分布式核心技术知识体系,就会与其他人拉开差距。


分布式系统看起来就像一个计算机。计算机包括五大体系结构(即冯诺依曼结构),它有五大部件:分别是控制器、运算器、存储器、输入及输出。你可以这么理解:一个分布式系统也包含这五大部件,其中最重要的是计算与存储。计算与存储由一系列网络节点组成,每个节点之间的通信就是输入与输出,各节点之间的调度管理就是控制器。



分布式架构技术组成


这么看来,分布式系统就像一个网络计算机,它的知识体系包括四个角度:

  1. 存储器,即分布式存储系统,如 NoSQL 数据库存储;
  2. 运算器,即分布式计算,如分布式并行计算;
  3. 输入输出,即分布式系统通信,如同步 RPC 调用和异步消息队列;
  4. 控制器,即调度管理,如流量调度、任务调度与资源调度。

可以从这四个角度来概括分布式系统的知识体系


那么具体的解题思路是什么呢? 这里以一个非常场景的面试题,“Redis 是否可以作为分布式锁”为例,咱们一起来分析一下问题背后隐藏的分布式理论知识,以及作为初高级研发工程师的解题思路。


解题思路


  1. 说明现实存在的问题


一般使用 setnx 方法,通过 Redis 实现锁和超时时间来控制锁的失效时间。但是在极端的情况下,当 Reids 主节点挂掉,但锁还没有同步到从节点时,根据哨兵机制,从就变成了主,继续提供服务。这时,另外的线程可以再来请求锁,此时就会出现两个线程拿到了锁的情况。


  1. 回归理论的指导


我们要保证同一把分布式锁的申请在同一时刻只能有一个服务拿到此锁,因此从 CAP 模型底层分析,分布式锁是 CP模型。而 Redis 集群的主从模式是 AP 模型。也就是说从架构设计哲学层面来看,分布式锁选用 Redis 集群的主从模式就是不优雅的(扩展:分布式锁存储选型在特地场景是很重要的,大家感兴趣可以学习下Redis、ZooKeeper、etcd等存储模型对比)


  1. 扩展到知识体系


Redis 属于分布式存储系统,你的头脑里就要有对分布式存储系统领域的知识体系。思考它的数据存储、数据分布、数据复制,以及数据一致性都是怎么做的,用了哪些技术来实现,为什么要做这样的技术或算法选型。学会从多维度、多角度去对比、分析同一分布式问题的不同方法,然后综合权衡各种方法的优缺点,最终形成自己的技术认知和技术判断力。


  1. 有技术的判断力


比如通过 Redis,你能想到目前分布式缓存系统的发展现状以及技术实现,如果让你造一个“Redis”出来,你会考虑哪些问题等。虽然在实际工作中不推荐重复“造轮子”,但在面试中要表现出自己具备“造轮子”的能力


总结


CAP 理论看似简单,但在面试中,对它的理解深度可以从侧面反映出你对分布式系统的整体理解能力和驾驭能力。

所以你不但要掌握如何在面试中回答案例中 CAP 原理的问题,而且还要掌握回答问题的思路,以后遇到类似的理论性知识的考察,都可以从三个层面回答。


  1. 展示理论深度。你可以从一个熟知的知识点出发,深入浅出地回答,比如它的工作原理、优劣势、适用场景等。


  1. 结合落地经验。你不能仅停留在理论理解,还要结合落地方案的技术实现,这样才能体现你的技术闭环思维。


  1. 展示知识体系,这是任何一个程序员向上发展的基础能力。理论深度和落地经验体现了作为程序员的基本素质,而知识体系和技术判断力则体现了你是否达到一个架构师的能力边界


今天又是一篇满满的干货,最近这两天北京下着大雨,这篇帖子是我在星巴克,一边喝着咖啡,一边给大家写完的,如果觉得有帮助,欢迎动动小手点点赞呀~[玫瑰][玫瑰]


#后端 #职场

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
#资源# #分享# 微信读书 得到电子书会员能覆盖很多书,找不到的,可以看下下面两个网站 https://zh.z-library.se/ https://zh.annas-archive.org/
22
#资源,好久没有在星球里给大家分享了,最近半年在忙自己的一个大事情,没怎么冒泡(无辜脸.jpg),趁五一假期的小尾巴,给大家分享一个很牛的知识库网站,包括编程语言、算法与软件架构、Web 与大前端、服务端开发、运维与高可用、云与分布式基础架构、人工智能与深度学习等等。 看界面还有完整的技术 & 产品 & 商业知识体系等知识,大家可以收藏学起来! https://ng-tech.icu/ #分享# #经验#
46
#职场# #经验# 隔壁星球小伙伴分享的,觉得写得不错,在分享一下给大家 《对职场的十点建议》 假如您的孩子大学毕业,初入社会,只允许您传授10条经验给他,您会说什么?对于很多像我一样农村出来的穷二代,父母面朝黄士背朝天供养我上大学和维持基本的生活已经拼尽全力,很多经验都需要自己付出实际的代价去获取,太昂贵。没有高人指点,自己悟性又一般,希望您能不音赐教。谢谢您的时间 排序不分先后。 第一是要用心。做什么事情都要用心。同样做一件事情,花不花心思,结果差很多。要么不做,要做就用心做好 第二要受得了委屈。工作不是在家里。想干就干,不想干就不干。稍微被说几句就服负气的玻璃心的人不适合工作,还是在家里呆着吧应该也没有什么成就 第三勤奋。天赋都差不多的情况下。比的就是谁更勤奋更努力。整体而言勤奋努力的运气就会更好一点。 第四就是,做杂事。下闲子,有用没用的事情都做做,整天只做有用的事情。也会错过那些现在看没什么用,但以后可能会很有用的事。 第五就是。多见人,什么人都聊聊,见见。机会更多。别一个人呆自己的世界里闷着,总拿自己的世界观去看这个世界。眼界只会越来越小 第六就是学会扛责任,遇到事情别推责任,错了就是错了,别找理由借口。 第七,别耍小聪明,耍滑头,一眼就看出来的聪明都是小聪明,挑肥拣瘦,偷工减料,损公肥私都是小聪明。时间久了,谁是谁,大多数人都一清二楚,没必要装。 第八,!学会辨别好人坏人,然后选择跟好人一起,离开坏人。所谓好坏未必是违法乱纪更多是没责任心,喜欢蹭你便宜,出了事,责任都推给你,好处都自己占的人,有这种领导赶紧离开 第九,尽量选择自己喜欢的行业,每天问问自己,喜欢什么擅长什么,把自己的长处做到极致,扬长避短能事半功倍 第十,做个好人,做个对世界抱有善意的人积极乐观的看待世界。这个世界永远都会存在各种问题,无论你悲观还是绝望,都依然存在乐观,悲观都改变不了世界,但是乐观能让你走的更远。悲观只会被抛弃。别做悲观的人也远离悲观的人。(校长语)
40
职场分享:PDCA 模型
37
#经验# #职场# 《混大厂,如何找到自己的生态位》 这两天前老板来深圳出差,一起吃了饭聊聊天,聊到一个话题,职场生态位, 大家也知道,现在大厂晋升也是越来越卷了,一方面是组织架构庞大,在降本增效的大目标下每个人要多做更多的活,但其实同质化也很严重,另一个方面,晋升考核越来越严格 职场生态位:指自己在职场生态当中所占据的位置,尤其是为关键岗位提供核心价值的位置。只有抢占了职场生态位,我们的地位才会最稳固,职位晋升才能最快,个人能力获得最大的提高。当然了,也能轻而易举地收获最多的Money。 在团队里面,你能解决问题,提供成果,或者能提供通往业务目标的方向/方法/捷径,替别人替组织赢得一个生存空间,在生态位上有自己的护城河,你就占据很大的优势。 举个例子,我们常见的,酒店前台,外卖小哥、快递员等等这类靠出卖苦力,没有特别技术含量的职位,就处于职场生态位的比较低端的位置,而且随时有被取代的可能。 而工程师、医生、律师、财务、高级管理人才等技术工种,这些随着经验积累,越来越值钱的职业,就处于职场上比较高端的生态位。 当然这里没有任何歧视岗位的意思,只是做一个对比,毕竟,几十年的工作经验很难被取代。 如果你已经在职场上抢占了不错的生态位,那么恭喜,把眼下工作好好做,就能提交一份满意的人生成绩单 微信公众号平台 18 年以后新注册的默认都没有留言功能,其实类比任何行业,早就是优势,比如社群,平台,人脉链接,早点抓住机会,抓住生态位,抱住大佬,靠近大佬,早点付费进群,抓住身边大佬的生态位,就比晚来的人占据极大的优势 那么,普通人如何找到自己的生态位? 《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=精进3》的作者采铜老师说:找到生态位很难,创造生态位却很简单。关键点只有三个字:被需要。  这个点怎么理解,比如说我们组的例子,因为最早和我同级的一个小伙伴呢,他来的最早,他可能大二就开始来这边实习了。 就现在他基本上在组里面工作时间最长的,而且对整个我们这趟业务刚做起来的时候,他是最原始的几个人之一,所以说他现在对整个业务的这个了解熟悉程度,上下游链路,包括和其他团队合作模式都比我们后来的人都要清楚,那么他就能做一个小组长的管理,有带人的经验,这样晋升机会就比别人大很多。 那么说回来,如果说你在一个新团队里面,可能是后面来的人,或者说刚加入不久的。那么如果你要找到自己的生态位的话,有几个建议 首先第一个就是说在这个团队中,你要找到自己熟悉的项目,或者感兴趣的项目,或者说要抢到一个很好的活,然后在这个周期中把这个活做好,做得出色,让领导满意,而且是被领导所关心的问题,把领导关心的问题解决好,自然而然领导就关注到你,机会就多了 另外一个你要就是跟一些合作方去聊,或者说一些历史的一些遗留问题去梳理啊,找到一些解决方案,然后呢把这个事一步步推进去,做一些优化之类的,能够改善我们现在已有系统的性能,这个你也可以做一个就是前期的一个技术积累,去做一个优化的一个方向积累,这样也能形成自己的壁垒。 另外还有就是除了把工作做好,如何把工作成果汇报的好也是一个技能,反正在互联网公司混,能力是一方面,让别人如何看到你的能力,展示出来也是很重要的事情。 先聊这么多,大家加油💪
25
下载 APP