java分布式面试CAP分别代表含义分析

目录
  • 引言
  • 1、面试官,说到CAP定理,那能详细说说CAP分别代表什么吗?
  • 2、面试官:听起来很简单,这只是概念,但是具体是什么意思呢?
  • 举例深入分析
  • 总结

引言

上一节讲面试中被问到分布式系统概念相关的,讲完了分布式系统的概念,优点缺点和 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 定理这个问题还难吗?

显然消息的延迟会带来数据不一致问题。理想情况下消息不丢失那数据会最终一致,你能保证消息不丢失吗?如何解决机问题,如果是我,我会选择 “最终一致性”,就是说不管消息延迟多久甚至丢失,设计一个离线定时任务,定期去扫描两个系统的数据,有不一致的情况就主动刷新同步,这样保证最终一致。

以上就是java分布式面试CAP分别代表含义分析的详细内容,更多关于java分布式面试CAP含义的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java面试题冲刺第二十三天--分布式

    目录 面试题1:说说什么分布式事务?解释一下什么是CAP? CAP理解: 追问1:怎么理解强一致性.弱一致性和最终一致性? 面试题2:了解BASE理论么? 追问1:基于BASE理论,举几个实际的例子 面试题3:实现分布式事务一致性(Consistency)的方法有哪些? 追问1:说一下二阶段提交(2PC)的原理吧 总结 面试题1:说说什么分布式事务?解释一下什么是CAP? 现在互联网开发多使用微服务架构,一个简单的操作,在服务端可能就是由多个服务和数据库实例协同完成的.但在一致性要求较高且高QP

  • 浅谈Java实现分布式事务的三种方案

    一.问题描述 用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库.由库存服务去维护库存数据库的信息.下图是系统结构图: 如何实现两个分布式服务(订单服务.库存服务)共同完成一件事即订单支付成功自动减库存,这里的关键是如何保证两个分布式服务的事务的一致性. 尝试解决上边的需求,在订单服务中远程调用减库存接口,伪代码如下: 订单支付结果通知方法{ ​ 更新支付表中支付状态为"成功". ​ 远程调用减库存接口减库存. } 上边的逻辑说明: 1.更新支付表状态为本

  • 详解Java TCC分布式事务实现原理

    概述 之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务. 业务场景介绍 咱们先来看看业务场景,假设你现在有一个电商系统,里面有一个支付订单的场景. 那对一个订单支付之后,我们需要做下面的步骤: 更改订单的状态为"已支付" 扣减商品库存 给会员增加积分 创建销售出库单通知仓

  • 分布式事务CAP两阶段提交及三阶段提交详解

    目录 1 关于分布式系统 1.1 介绍 1.2 优势和不足 2 分布式事务 2.1 CAP理论 2.2 CAP的组合情况 2.3 数据一致性模型 2.4 分布式事务应用场景 2.4.1 典型支付场景 2.4.2 在线下单 2.4.3 跨行转账 2.5 常见分布式一致性保障(分布式事务解决方案) 2.5.1 XA 两阶段提交协议 2.5.2 XA三阶段提交 2.5.3 MQ事务 2.5.4 TCC事务 2.5.5 最终补偿机制,同于MQ事务 1 关于分布式系统 1.1 介绍 我们常见的单体结构的集

  • java分布式面试CAP分别代表含义分析

    目录 引言 1.面试官,说到CAP定理,那能详细说说CAP分别代表什么吗? 2.面试官:听起来很简单,这只是概念,但是具体是什么意思呢? 举例深入分析 总结 引言 上一节讲面试中被问到分布式系统概念相关的,讲完了分布式系统的概念,优点缺点和 RPC 后,我以为这个问题就到此结束了,没想到成功给自己挖了个坑(微笑脸),关于 CAP,以前只是听说过,并没有详细点整理过,这一次问好好整理了下. CAP 问题已经成了计算机科学中一个研究领域,之前说到分布式系统有哪些优势时讲到三个提升: 1. 系统可用性

  • java分布式面试接口如何保证幂等及概念理解

    目录 引言 1.幂等的概念 问题分析: 事后问题分析: 关于这个接口的幂等设计 深入分析: 2.工作中常见的幂等设计场景 3.幂等接口常见设计方案 总结 引言 稳定性设计第一篇:这一小节开始讲设计系统稳定性保证的相关设计,谁都不想自己负责的系统三天两头就出故障,也不想周六日跟女票葡萄美酒夜光杯的时候一个电话call去VPN办公,那么你就想办法让你的系统尽量稳定,我们的目标是让系统“无人值守”. 阿里新零售和阿里妈妈,美团,过去我面试这些公司都被问过接口幂等相关问题,接口幂等设计在分布式系统开发中

  • java分布式面试降级组件Hystrix的功能特性

    目录 引言 1.面试官:能简单介绍下Hystrix有哪些功能吗? 1.1.fail-fast(快速失败) 1.2.Fallback优雅降级机制 1.3.线程/信号量隔离机制 线程隔离: 信号量隔离: 2.面试官:刚刚说到线程隔离,那实际使用中是否打开超时线程中断开关? 3.面试官:那你是如何估计线程池大小的? 深入分析 Hystrix历史 Hystrix的主要功能特性 HystrixDemo 哪些情况下会触发fallback? 附录:Hystrix策略配置 Sentinel与Hystrixres

  • java分布式面试系统限流最佳实践

    目录 引言 1.面试官: 哪些场景系统使用了限流?为什么要使用限流? 2.面试官: 那你了解哪些常用限流算法? 1.计数器方法: 2.漏斗算法: 3.令牌桶算法: 3.面试官: 那具体这值该如何评估,说到现在我还是不知道限流到底要怎么设置,可以给我一点经验方法吗? 深入分析 使用线程池实现: 借助Guava实现: 总结 引言 前面讲了系统中的降级熔断设计和对 Hystrix 组件的功能了解,关于限流降级还有一个比较重要的知识点就是限流算法. 如果你面试的是电商相关公司,这一块就显得更加重要了,秒

  • Java并发系列之ConcurrentHashMap源码分析

    我们知道哈希表是一种非常高效的数据结构,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别.Java为我们提供了一个现成的哈希结构,那就是HashMap类,在前面的文章中我曾经介绍过HashMap类,知道它的所有方法都未进行同步,因此在多线程环境中是不安全的.为此,Java为我们提供了另外一个HashTable类,它对于多线程同步的处理非常简单粗暴,那就是在HashMap的基础上对其所有方法都使用synchronized关键字进行加锁.这种方法虽然简单,但导致了一个问题,那就是在同一时间

  • Java并发系列之Semaphore源码分析

    Semaphore(信号量)是JUC包中比较常用到的一个类,它是AQS共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制.Semaphore提供了一个许可证的概念,可以把这个许可证看作公共汽车车票,只有成功获取车票的人才能够上车,并且车票是有一定数量的,不可能毫无限制的发下去,这样就会导致公交车超载.所以当车票发完的时候(公交车以满载),其他人就只能等下一趟车了.如果中途有人下车,那么他的位置将会空闲出来,因此如果这时其他人想要上车

  • Java分布式锁的概念与实现方式详解

    什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁. 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个的顺序执行,否则会出现并发问题. 如何控制呢?就是设置一个各个线程都能看的见的标志.然后,每个线程想访问临界区域时,都要先查看标志,如果标志没有被占用,则说明目前没有线程在访问临界区域.如果标志被占用了,则说明目前有线程正在访问临界区域,则当前线程需要等待. 这个标志,就是锁. 在单机多线程的java程

  • 详解Java分布式IP限流和防止恶意IP攻击方案

    前言 限流是分布式系统设计中经常提到的概念,在某些要求不严格的场景下,使用Guava RateLimiter就可以满足.但是Guava RateLimiter只能应用于单进程,多进程间协同控制便无能为力.本文介绍一种简单的处理方式,用于分布式环境下接口调用频次管控. 如何防止恶意IP攻击某些暴露的接口呢(比如某些场景下短信验证码服务)?本文介绍一种本地缓存和分布式缓存集成方式判断远程IP是否为恶意调用接口的IP. 分布式IP限流 思路是使用redis incr命令,完成一段时间内接口请求次数的统

  • 深入浅出探索Java分布式锁原理

    目录 什么是分布式锁?它能干什么? 分布式锁实现方案 基于数据库的分布式锁实现方案 实现原理 方案分析 基于Redis的分布式锁实现方案 基于sentnx命令的实现原理 方案分析 基于Redisson实现 RedLock 方案分析 基于Zookeeper的分布式锁实现方案 实现原理 方案分析 分布式锁方案到底选哪个? 总结 什么是分布式锁?它能干什么? 相信大家对于Java提供的synchronized关键字以及Lock锁都不陌生,在实际的项目中大家都使用过.如下图所示,在同一个JVM进程中,T

  • 分布式面试分布式锁实现及应用场景

    目录 引言 1.面试官: 你有遇到需要使用分布式锁的场景吗? 事件A: 事件B: 2.面试官: Redis分布式锁实现方法 1.基于Redis的分布式锁 3.面试官: 那解锁操作呢? 使用del命令解锁 3.面试官: 基于ZooKeeper的分布式锁实现原理 额外补充 方法一: 方法二: 总结 引言 锁是开发过程中十分常见的工具,你一定不陌生,悲观锁,乐观锁,排它锁,公平锁,非公平锁等等,很多概念,如果你对java里的锁还不了解,可以参考这一篇:不可不说的Java“锁”事,这一篇写的很全面了,但

随机推荐