【原创】分布式之大话CAP
引言
本文翻译自博客
http://ksat.me/a-plain-english-introduction-to-cap-theorem/
博主觉得这个故事讲的生动活泼,因此翻译来给大家分享,顺便加上了点自己矫揉造作的见解,希望大家有所收获!
CAP理论大概说一下就是,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance)。
目前网上对这三大特性的解释还是比较模糊,因此有了本文!
正文
"记忆公司"登场
昨天晚上你的妻子感谢你记得她的生日,并给她买了礼物。突然,一个点子闪过了你的脑海!人们现在普遍记忆力变差了,而你的记忆力却十分的好。因此,为何不成立一间公司可以充分运用自己的记忆天赋来赚钱呢?心动不如行动,你马上登报分享你的点子

以下是一次你和顾客的电话对话。
顾客:Hey,麻烦帮我记住我邻居的生日。
你:当然可以。他生日什么时候?
顾客:1月2日。
你:(在一个本子,翻到这位顾客的一页,记录下他邻居的生日。)好的,已记录好。下次你找回邻居的生日,请再次拨打电话。
顾客:谢谢。
你:不客气,本次收费0.1美元。
业务变大了
你的想法是如此简单,除了纸质笔记本和手机之外什么都不需要,但却非常有效, 你每天都开始接听数百个电话。
但慢慢的,问题出现了。顾客打电话进来时,需要等待的时间越来越多,另外,当你生病时,所有顾客都不能获得服务,这令人很是烦恼。
于是,你开始了一个新的计划:
- 你和你的妻子同时接收顾客的电话
- 顾客仍然只需要记着一个公司的服务电话 (555)–55-REMEM
- 一个路由器会将顾客的电话分发到你和妻子电话上
第一次服务出问题
你的新计划实行了两天后,你接到了一个老客户Jhon的电话。对话内容如下
John:Hey
你:很高兴拨打记忆公司电话,有什么可以帮到你吗
John:可以告诉我去新泽西的航班是什么时候吗
你:当然,稍等1秒。(然后你翻开 John 的页面,发现并没有 John 航班的记录)
你:你好,是不是搞错了,我们这里并没有关于你航班的信息
John:什么?!昨天我才刚打电话过来说去新泽西航班的事情
这是怎么回事勒? Jhon在撒谎么?你稍加思考便找到了原因!应该是妻子接到了电话,你走到妻子的桌子,发现妻子将 John 的航班记录在了本子上,这时你才意识到导致问题的原因,妻子接听到 John 的电话,但你的本子没有 John 的记录。
这就存在一个严重的问题了!你的系统没法保证一致性。打进来的电话可能其中一人接听并记录下来,下次电话查询时却可能由另一人接听,这样就会出现不一致的问题,无法为顾客准确提供服务。
怎么解决一致性问题
当你的妻子睡着后,晚上你躺在床上辗转难眠。在第二天清晨,你想到了一个全新的计划,你叫醒了你的妻子并告诉她:
“亲爱的,这是我们现在要做的!”
- 我们两个人中任何一个人接到电话(客户要求我们记录事情的时候),在挂电话之前,我们都要通知另一个人
- 我们两个同时在本子更新这位顾客的记录
- 下次这位顾客再次打电话进来查询,这时我们不需要告知对方,因为两个本子都有这位顾客的记录了
你对妻子说,这个方案只有一个问题,当有顾客需要记录时,我们不能并行地工作。例如,你接收到记录的电话并这个信息告知我,这时我就不能再接听其他顾客的电话了。但这个问题基本上也是可以接受的,因为大部分顾客的电话都是查询的。
然而,这个方案虽然解决了一致性问题,但是依然存在可用性问题!如果某天我们其中一个人有事不能工作了怎么办?因为,我们需要同时更新我们两个人的本子,当我接到一个记录的电话时,而你恰好不在,我就无法更新你的本子。这样我们就无法完成客户的请求,可用性无法保证!
更好的解决方案
难道就没有同时满足 一致性和可用性 的设计吗?
你经过一夜的思考,又想到了一个方案,具体如下:
- 当接到有记录需求的电话,如果我们两人当天都上班,那么我们同时记录下这位顾客的记录
- 如果有一个人没上班,我们就将变更信息以email的形式发给另一个人
- 第二天,没上班的那个人上班后,先接收e-mail,并在自己的本子上记录所有顾客的要求。记录好后,才开始接收第一个电话。
这样我们就同时满足了一致性和可用性的要求。
妻子生气了
又过了一段时间,公司经营不错。由于你藏私房钱的原因,妻子生气了。
于是她接到一位顾客需要记录的电话并没告知你。由于记录没能在两个本子更新,你的设计完全被打破了。你的设计建立在两人良好沟通的前提下,如果出现沟通无法进行的情况,系统就出现问题了。也就是说,你的设计没有达到 分区容忍性(partition tolerant)的要求。
ps:这就是满足一致性和可用性的情况,无法保证分区容忍性。
当然,你也可以允许沟通无法进行的情况下继续提供服务。你要是选择可用性,你就无法保证你和你妻子之间本子上记录的内容一致。
ps:这就是满足分区容忍性和可用性的情况,无法保证一致性。
最后,你也可以允许沟通无法进行的情况下继续提供服务。你要是选择一致性,
那么这个顾客的要求就无法完成,也就是可用性无法满足。
ps:这就是满足分区容忍性和一致性的情况,无法保证可用性。
总结
下面回顾CAP理论,对照三个定义如下。可以发现,我们最多满足其中的两个要求
一致性:一旦顾客更新了记录,下次再打电话查询时,总能获取最新的记录
可用性:只要你和妻子有人上班,记忆公司总能为顾客提供服务
分区容忍性:即使你和妻子的沟通无法进行,记忆公司仍然可以提供服务
【原创】分布式之大话CAP的更多相关文章
- 分布式事务的CAP理论 与BASE理论
CAP理论 一个经典的分布式系统理论.CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错性(P:Partition ...
- 分布式数据库中CAP原理(CAP+BASE)
分布式数据库中CAP原理(CAP+BASE) 传统的ACID 1)原子性(Atomicity): 事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功. 2)一致性(Con ...
- [转帖]浅谈分布式一致性与CAP/BASE/ACID理论
浅谈分布式一致性与CAP/BASE/ACID理论 https://www.cnblogs.com/zhang-qc/p/6783657.html ##转载请注明 CAP理论(98年秋提出,99年正式发 ...
- 分布式 基本理论 CAP 2
关于P P, 即 Partition字面意思是网络分区,其实 包括了 各种网络问题, 我们要把它理解 一个 广义的 分区问题. P 涉及到了 时间, 这么说吧, 出现了分区, 那就是节点之间 “长久的 ...
- 分布式一致性原理—CAP
背景 随着分布式事务的出现,传统的单机事务模型(ACID)已经无法胜任,尤其是对于一个高访问量.高并发的互联网分布式系统来说. 如果我们要求严格一致性,很可能就需要牺牲掉系统的可用性,反之亦然.但两者 ...
- 在分布式数据库中CAP原理CAP+BASE
本篇博文的内容均来源于网络,本人只是整理,仅供学习! 一.关系型数据库 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (At ...
- 分布式:ACID, CAP, BASE
本文主要讲述分布式系统开发的一些相关理论基础. 一.ACID ACID是一系列对系统中数据进行访问与更新的操作所组成的一个程序执行的逻辑单元,狭义上的事务特指数据库事务. 1.Atomic原子性 事务 ...
- 分布式理论 之 CAP 定理
-----------------------------------------------------入巷间吃汤面 笑看窗边飞雪. 目录: 什么是 CAP 定理 为什么只能 3 选 2 能不能解决 ...
- 分布式 基本理论 CAP 之 各分布式系统的cap支持情况
分布式系统.理论.协议 非常非常多, 它们多cap 的支持是怎么样的呢? 需要注意的是,分布式系统 为了应付各种 复杂 应用场景,支持各种各样的功能,可能有的提供了选项或某种机制, 某个时刻,支持CP ...
随机推荐
- Docker系列07—Dockerfile 详解
本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...
- React-native搭建移动端ios开发环境实践笔记
开发环境的搭建,按照 https://reactnative.cn/docs/getting-started/ 里面的步骤一步一步来,这里记录下需要注意的几点:1.初始化react-native项目的 ...
- C# 常用小点
1]创建文件夹 //相对路径 string FilePath = Server.MapPath("./") + "ImageFile/Images/" + Da ...
- EF操作数据库的步骤和一些简单操作语句
这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...
- Java开发笔记(三十一)字符类型的表达
前面介绍的Java编程,要么是与数字有关的计算,要么是与逻辑有关的推理,充其量只能实现计算器和状态机.若想让Java运用于更广阔的业务领域,就得使其支撑更加血肉丰满的业务场景,而丰满的前提是能够表达大 ...
- 关于mybatis条件查询 报错:元素内容必须由格式正确的字符数据或标记组成
原查询 select sum(case when age<=16 then 1 else 0 end ) age1, sum(case when age>16 and age<=25 ...
- webpack入门教程--2
这次是创建第二个JS文件. 我们还是在app文件夹中创建一个叫做book2.js的JS文件,并在其中输入以下代码: module.exports = "It works from book2 ...
- 广州.NET微软技术俱乐部 微信群有用信息集锦
考虑到广州.NET微软技术俱乐部 微信群 十分活跃. 有用信息很有可能被淹没. 所以建立此贴. 首先群的活跃是十分重要的. 所以我是不可能把群搞得像技术论坛和github一样, 因为微信群的定位我在& ...
- 腾讯云centos7远程连接配置
1.申请腾讯云 注册腾讯云账号,申请一个centos7的服务器,1G内存,1核处理器,1M网速. 对于这种入门级配置,建议还是别用windows server了,不然不装任何东西,光运行系统就需要60 ...
- iOS-----------关于UDID
最近看友盟的SDK更新日志:(设备系统的正常升级不会改变OpenUDID) Apple公司于2013年5月1日开始,拒绝采集UDID的App上架App Store. 为适应Apple公司的这一政策,2 ...