java分布式面试CAP分别代表含义分析
作者:Q.E.D 发布时间:2021-10-05 17:54:47
引言
上一节讲面试中被问到分布式系统概念相关的,讲完了分布式系统的概念,优点缺点和 RPC 后,我以为这个问题就到此结束了,没想到成功给自己挖了个坑(微笑脸),关于 CAP,以前只是听说过,并没有详细点整理过,这一次问好好整理了下。
CAP 问题已经成了计算机科学中一个研究领域,之前说到分布式系统有哪些优势时讲到三个提升:
1. 系统可用性提升。
2. 系统并发能力提升。
3. 系统容错能力提升。
那么这三方面在实施起来可以同时满足吗?答案是不能,设计分布式系统的时候,设计者需要理解一个重要的理论概念,CAP 定理。
1、面试官,说到 CAP 定理,那能详细说说 CAP 分别代表什么吗?
问题分析:一个很经典的概念性面试题。
答:关于 CAP,它是 2000 年 7 月,加州大学伯克利分校的 Eric Brewer 教授在 ACM PODC 会议上提出 CAP 猜想。2 年后,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP。之后,CAP 理论正式成为分布式计算领域的公认定理。
C 的全拼是 Consistency,代表 一致性的意思。
A 的全拼是 Availability,代表 可用性的意思。
P 的全拼是 Partition tolerance,代表 分区容错性的意思。
2、面试官:听起来很简单,这只是概念,但是具体是什么意思呢?
问题分析:下次这种问题不能等面试官来问了,这面试有点挤牙膏的感觉,不如我一次说完,让面试官闭嘴。
答:一个分布式系统最多同时满足一致性 (Consistency),可用性 (Availability) 和分区容忍性 (Partition Tolerance) 这三项中的两项。
同时满足一致性(C)和可用性(A)就要牺牲掉容错性(P)
同时满足可用性(A)和分区容错性(P)就要牺牲掉一致性(C)
同时满足一致性(C)和分区容错性(P)就要牺牲掉可用性(A)
(开始拿起纸笔画了三个圈圈)
这三个象限,只能同时满足其中两个圆圈的交集。
面试官:行了行了,这个理论性的问题就到这,时间有限,我们聊点别的。
举例深入分析
用 Redis Cluster 高可用架构举例:Redis 就能会将数据分片到多个实例 (按照 slot 存储) 中,即一个机房分担一部分数据。Master 负责写,Master 会自动同步到 Slave。
Redis 去中心集群架构优点:
1. 无中心架构:三机房部署,其中一主一从构成一个分片,之间通过异步复制同步数据,异步复制存在数据不一致的时间窗口,保证高性能的同时牺牲了部分一致性。一旦某个机房掉线,则分片上位于另一个机房的 slave 会被提升为 master 从而可以继续提供服务。
2. 可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除。
3. 降低运维成本,提高系统的扩展性和可用性。
分析,这个分布式架构中满足了 CAP 中哪个两个定理?
优点 1 中讲到,三机房部署,每个机房有一主一从,即一个 Master 对应一个 Slave ,但是你会发现,机房 1 中的 Master 1 连接的 Slave 在机房 2,机房 2 中的 Master 2 连接的 Slave 在机房 3,机房 3 中的 Master 3 连接的 Slave 在机房 1,这样构成一个环,为什么要这样设计?
假设:机房断电 or 火灾 or 其他各种原因,反正就是机房 1 所有机器都不能用了。
这个时候那机房 1 的全部数据都不能访问了吗?这显然是我们不希望的。前面已经说了 Master 负责写,Master 会自动同步到 Slave,如果 Master 写服务宕机,Slave 读服务会被提升为 Master ,也就是说机房 1 的数据在机房 2 的 Slave2 上还有备份,数据还在,在宕机的 Master 没有恢复前 Slave 要同时承担读写服务,虽然累一点,但是还能用,这样设计是为了提高可用性(A),和容错性(P)。系统准许你一台机器或者整个机房都宕机,系统仍然能用。
但是你会发现,单个机房如果距离很远, Master 1 的数据同步到 Slave2 上是跨机房,跨机房同步肯定不如同机房块,这样一来 Slave2 负责的读就会有延迟,Master1 要更新的数据还没有同步到他在另一个机房的备份前,读操作就是不一致的,这样设计显然是牺牲掉一致性(C)。相信这样分析应该能理解 CAP 定理了。
进一步分析:
让同一组 Master - Slave 放在一个机房,同机房复制数据不是更快?这样能不能解决数据一致(C)问题,答案是能,还有更好的解决一致性的办法就是不要 Master - Slave 组合,就一台机器,一台机器同时担任读写请求,没有延迟不存在数据一致性问题。这是时候如果宕机了怎么办?这样的架构下,那就真的是不可用了,解决了一致性(C)却牺牲了可用性(A)和容错性(P),太不划算了。
总之,分布式系统下,CAP 确实无法同时满足,在 Redis 去中心集群架构中,最优的解决方案还是满足可用性(A)和分区容错性(P)就要牺牲掉一致性(C),即使跨机房同步数据,延迟也不过 1s,数据不一致的问题只出现在 1s 内,日常开发中,很少遇到要求强一致性的场景。例如订单系统,用户更新了订单支付状态,读订单状态是在从库,有什么读场景等不来这一秒?
如果真的必须要求强一致性,那可能就必须调整分布式架构方案来。
总结
本文主要讲解了 CAP 定理的概念,为什么要学习这个概念,设计高可用分布式系统时,你必须知道系统的短处,懂得 CAP 能让你根据实际情况有舍有得。面试会被经常问到,比如,你说你使用了消息队列,解决了系统耦合问题,提高了响应速度,那面试官问题:使用消息队列有啥缺点?如果你知道 CAP 定理这个问题还难吗?
显然消息的延迟会带来数据不一致问题。理想情况下消息不丢失那数据会最终一致,你能保证消息不丢失吗?如何解决机问题,如果是我,我会选择 “最终一致性”,就是说不管消息延迟多久甚至丢失,设计一个离线定时任务,定期去扫描两个系统的数据,有不一致的情况就主动刷新同步,这样保证最终一致。
来源:https://blog.csdn.net/qq_34272760/article/details/120734670


猜你喜欢
- 如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・
- Android图片上传的应用场景,供大家参考,具体内容如下在Android开发中,很多时候我们需要进行图片,文件的上传下载,最直接的一个应用
- 导入项目集成环境:IntelliJ IDEA 2020.1.2演示系统:DELL Windows 10Eclipse项目如何导入IDEA并成
- mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默
- /** * 考拉兹猜想:Collatz Conjecture * 又称为3n+1猜想、冰雹猜想、角谷猜想、哈塞猜想、乌拉姆猜想或叙拉古猜
- 在谈 JVM 内存区域划分之前,我们先来看一下 Java 程序的具体执行过程,我画了一幅图。Java 源代码文件经过编译器编译后生成字节码文
- 由于大多数便携式设备支持浏览图片而不支持浏览PowerPoint 文件,所以相比较而言,图像对于用户而言更加友好。除此之外,将PowerPo
- 前面有文章曾经地介绍过MediaPlayer的基本用法,这里就更加深入地讲解MediaPlayer的在线播放功能。本文主要实现MediaPl
- 在一个比较坑的需求里,一段文字右上角需要追加一个圆形红点。最右侧有个金额,红点动态随着文字移动,然后各种摆布局,一下午坑死我了。后来果断放弃
- 在C# winform 应用程序中,对于键盘响应事件,经常使用到"KeyPress"、“KeyUp”、"Key
- 1. 基础知识集合Java.util包下的常用子类,集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高效的进行读写,无论哪种具体
- 概述AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分
- //执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。其中静态代码块只执行一次。构造代码块在每
- 项目场景:适用于接口数据敏感信息,比如 明文传输姓名、居住地址、手机号等信息,如果存在明文传输敏感数据问题、及数据泄漏风险,则可使用此方法加
- 一、方法的定义1.方法体中最后返回值可以使用return, 如果使用了return, 那么方法体的返回值类型一定要指定2.如果方法体重没有r
- 在 Android 手机中内置了一款高性能 webkit 内核浏览器, SDK 中封装为一个叫做 WebView 组件。 WebView 类
- 在学习获取相册中图片进行裁剪的时候遇到了比较大的问题,在纠结了近半天才真的解决,下面分享一下学习经验。问题:选择了相册中的图片之后要进入图片
- 简介OCSP在线证书状态协议是为了替换CRL而提出来的。对于现代web服务器来说一般都是支持OCSP的,OCSP也是现代web服务器的标配。
- 创建SpringBoot项目在引入Druid之后,根据视频中的教程在application.yaml文件中添加了一些配置(下面的代码是不合乎
- 首先为大家介绍Andorid5.0原生下拉刷新简单实现。先上效果图;相对于上一个19.1.0版本中的横条效果好看了很多。使用起来也很简单。