面试官如何考察与CAP相关的理论?

news2024/11/17 20:38:22

在互联网技术面试中,考察分布式技术已经是面试的标配了。很多招聘信息中,你能发现,一线互联网公司在对候选人的要求中都有“分布式系统设计”这一关键词。无论你是程序员,还是架构师,都要掌握分布式系统设计。

案例背景

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

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

案例分析

相信只要学习过分布式技术的相关知识,基本上都知道 CAP 理论指的是什么:C(Consistency)是数据一致性、A(Availability)是服务可用性、P(Partition tolerance)是分区容错性。

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

很多候选者如果发现面试题(比如“为了数据容灾,我们会做数据的主从备份,那么主从节点的数据一致性对调用端有什么影响呢?”)涉及了对“CAP 的理解和思考”,会下意识地做出类似的答案:“ CAP 理论描述了在出现网络分区的情况下,要在 C 和 A 之间做取舍,所以会影响站在调用端的视角看系统是不可用的”。如果是我的话,大概会给个及格分,并认为这样的回答,只能证明你有准备,不能证明你有能力。

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

从我的经验出发,如果你想答得更好,你需要先掌握 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 之间取得平衡。

PACELC

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

实践经验

你要意识到,互联网分布式的设计方案是数据一致性和系统可用性的权衡,并不是非此即彼,这一点尤为重要。所以即使无法做到强一致性(简单来讲强一致性就是在任何时刻所有的用户查询到的数据都是最新的),也可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

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

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

  • 电商网站在双十一大促等访问压力较大的时候,关闭商品排行榜等次要功能的展示,从而保证商品交易主流程的可用性,这也是我们常说的服务降级;

  • 为了错开双十一高峰期,电商网站会将预售商品的支付时间延后十到二十分钟,这就是流量削峰

  • 在你抢购商品的时候,往往会在队列中等待处理,这也是常用的延迟队列

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

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

如果你想应聘的是初中级研发工程师,那么结合上述思路,从理论理解到落地实践,你已经可以把 CAP 理论答得较为清楚了。回答问题的逻辑可以参考我给出的建议:

  • 先充分理解理论原理,不能仅浮在概念上(这一点需要你课下下功夫);

  • 其次需要有自己的思考,表现出你思考能力的不同;

  • 然后将理论结合于实践,讨论实际中处理问题时的思考逻辑。

技术认知

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

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

分布式架构技术组成

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

  1. 存储器,即分布式存储系统,如 NoSQL 数据库存储;

  2. 运算器,即分布式计算,如分布式并行计算;

  3. 输入输出,即分布式系统通信,如同步 RPC 调用和异步消息队列;

  4. 控制器,即调度管理,如流量调度、任务调度与资源调度。

你可以从这四个角度来概括分布式系统的知识体系(每个分支的具体子知识体系和知识点,我会在后面的课程中一一为你讲解)。

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

解题思路

  • 说明现实存在的问题

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

  • 回归理论的指导

根据对 CAP 理论的理解,Redis 的设计模型是 AP 模型,而分布式锁是一个 CP 场景,那么很明显,将 Redis 这种 AP 模型的架构应用于 CP 的场景,在底层的技术选型上就是错误的。

  • 扩展到知识体系

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

  • 有技术的判断力

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

总结

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

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

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

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

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

本节课的思考题是:假如让你来设计电商网站的高可用的方案,按照 CAP 理论的要求,你会考虑哪些问题? 欢迎你把答案写到留言区,和我一起讨论。

文章结尾,送给你一句话:“技术人,要有落于地的能力,还要有浮上天的本事”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/956631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度探索JavaScript中的原型链机制

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

手游排行前十名,手游排行榜2023前十名

今天为大家带来手游排行前十名,如今流行的手机游戏专注于在画面和游戏性方面为玩家提供更逼真、更流畅的游戏体验。在画面方面,手游开发商经常使用先进的游戏引擎和技术来提高游戏的图形质量和细节,以及增加游戏的动态照明和物理效果&#xf…

day-37 代码随想录算法训练营(19)贪心part06

738.单调递增的数字 思路:在给的数字中找到第一个开始递减的两个数字 ; 将前一个数字减1 ; 后面的数字全部变为最大值9 968.监控二叉树 思路:分三种状态:0无覆盖 1有监控 2有覆盖 分四种情况:1.两…

一、C#—概述环境安装(1)

🌻🌻 目录 一、 C#概述1.1 为啥学习C#1.2 TIBOE编程语言排行榜1.3 IEEE编程语言排行榜1.4 什么是C#1.5 C#创始人1.6 C#发展历史1.7 C#特点1.8 C#与Java1.9 .NET Framework1.10 C# 与 .NET Framework1.11 C#得应用领域1.12 C#能做什么 二、开发环境得安装…

go学习part21 Redis和Go(2)

1.三方库安装 309_尚硅谷_Go连接到Redis_哔哩哔哩_bilibili 借鉴: Golang 安装 Redis_go fiber 安装redis_柒柒伍贰玖。的博客-CSDN博客 三方redis库已经迁移到以下网址,go get github.com/gomodule/redigo/redis gomodule/redigo: Go client for Red…

【前端学习记录】neffos插件与控制台交互

背景 最近项目上有个需求需要用到websocket,于是就学了一下关于websocket的使用方法。不过由于后台使用的框架限制,需要前后端一起使用neffos插件,中间踩了很多的坑,这里简单记录一下。 websocket WebSocket 是一种在客户端和服…

计算机视觉-YOYO-

目录 计算机视觉-YOYO 目标检测发展历程 区域卷积神经网络(R-CNN) Fast R-CNN Mask R-CNN模型 比如SSD、YOLO(1, 2, 3)、R-FCN 目标检测基础概念 边界框、锚框和交并比 边界框(bounding box) 锚框(Anchor box) 交并比 …

win10 ping不通 Docker ip(解决截图)

背景: win10下载了docker desktop就是这个图,然后计划做一个springboot连接docker。 docker部署springboot :docker 部署springboot(成功、截图)_總鑽風的博客-CSDN博客 问题:spring boot部署docker后,docker接口通了&#xff0…

并发编程的故事——Java线程

Java线程 文章目录 Java线程一、线程创建二、线程运行三、线程运行四、主线程和守护线程五、线程的五种状态六、线程的六种状态七、烧水泡茶案例 一、线程创建 创建线程方法一: Thread重写run方法 Slf4j(topic "c.MyTest1") public class MyTest1 {publ…

Linux系统Ubuntu配置Docker详细流程

本文介绍在Linux操作系统Ubuntu的18.04及以上版本中,配置开源容器化平台和工具集Docker的详细方法;其中,我们以配置Docker平台的核心组件之一——Docker Engine为例来详细介绍。 首先,大家需要明确,我们常说的Docker&a…

设计模式-原型模式详解

文章目录 前言理论基础1. 原型模式定义2. 原型模式角色3. 原型模式工作过程4. 原型模式的优缺点 实战应用1. 原型模式适用场景2. 原型模式实现步骤3. 原型模式与单例模式的区别 原型模式的变体1. 带有原型管理器的原型模式2. 懒汉式单例模式的原型模式实现3. 细粒度原型模式 总…

敏捷开发要点

敏捷开发是一种以人为核心,迭代、增量式的软件开发方法。它强调团队成员的自我管理、面对变化时的快速适应能力,以及持续的沟通和协作。 以下是敏捷开发的几个要点: 敏捷宣言:敏捷开发遵循敏捷宣言,其中包括四个价值声…

Java单元测试及常用语句 | 京东物流技术团队

1 前言 编写Java单元测试用例,即把一段复杂的代码拆解成一系列简单的单元测试用例,并且无需启动服务,在短时间内测试代码中的处理逻辑。写好Java单元测试用例,其实就是把“复杂问题简单化,建单问题深入化“。在编写的…

stm32CubeMX HAL W5500芯片介绍 第一章

W5500芯片介绍 文章目录 W5500芯片介绍简单简绍以太网以太网分五层:第一层物理层:第二层:数据链路层:第三层:网络层:第四层:传输层:第五层:应用层:以太网应用…

redis面试题二

redis如何处理已过期的元素 常见的过期策略 定时删除:给每个键值设置一个定时删除的事件,比如有一个key值今天5点过期,那么设置一个事件5点钟去执行,把它数据给删除掉(优点:可以及时利用内存及时清除无效数…

《存储IO路径》专题:IO块设备的创建

今天我们来一起学习一下Linux块设备层。它就像是一位大厨,为我们准备各种数据的饕餮盛宴。这个大厨非常厉害,不仅能够读取和写入数据,还能对数据进行各种复杂的操作,比如切割、合并、复制等等。那么,块设备层是如何实现…

C#-抽象类与接口

文章目录 一、抽象类和接口总结总结补充说明主要区别 二、抽象类2.1 抽象类概述与声明2.2 抽象方法2.3 抽象类与抽象方法的使用 三、接口3.1 接口概述概述特征声明示例 3.2 接口的实现和继承说明示例 3.3 显式接口成员实现说明注意示例 一、抽象类和接口总结 总结 抽象类和接…

k8s使用ECK(2.4)形式部署elasticsearch+kibana-http协议

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、准备elasticsearch-cluster.yaml二、部署并测试总结 前言 之前写了eck2.4部署eskibana,默认的话是https协议的,这里写一个使用http…

【docker】docker的一些常用命令-------从小白到大神之路之学习运维第92天

目录 一、安装docker-ce 1、从阿里云下载docker-cer.epo源 2、下载部分依赖 3、安装docker 二、启用docker 1、启动docker和不启动查看docker version 2、启动服务查看docker version 有什么区别?看到了吗? 3、看看docker启动后的镜像仓库都有什…

解密Spring MVC异常处理:从局部到全局,打造稳固系统的关键步骤

😀前言 在现代软件开发中,异常处理是不可或缺的一部分,它能够有效地提高系统的稳定性和健壮性。在Spring MVC框架中,异常处理机制起着至关重要的作用,它允许开发者在程序运行过程中捕获、处理和报告异常,从…