引言

本文翻译自博客
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的更多相关文章

  1. 分布式事务的CAP理论 与BASE理论

    CAP理论 一个经典的分布式系统理论.CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错性(P:Partition ...

  2. 分布式数据库中CAP原理(CAP+BASE)

    分布式数据库中CAP原理(CAP+BASE) 传统的ACID 1)原子性(Atomicity): 事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功. 2)一致性(Con ...

  3. [转帖]浅谈分布式一致性与CAP/BASE/ACID理论

    浅谈分布式一致性与CAP/BASE/ACID理论 https://www.cnblogs.com/zhang-qc/p/6783657.html ##转载请注明 CAP理论(98年秋提出,99年正式发 ...

  4. 分布式 基本理论 CAP 2

    关于P P, 即 Partition字面意思是网络分区,其实 包括了 各种网络问题, 我们要把它理解 一个 广义的 分区问题. P 涉及到了 时间, 这么说吧, 出现了分区, 那就是节点之间 “长久的 ...

  5. 分布式一致性原理—CAP

    背景 随着分布式事务的出现,传统的单机事务模型(ACID)已经无法胜任,尤其是对于一个高访问量.高并发的互联网分布式系统来说. 如果我们要求严格一致性,很可能就需要牺牲掉系统的可用性,反之亦然.但两者 ...

  6. 在分布式数据库中CAP原理CAP+BASE

    本篇博文的内容均来源于网络,本人只是整理,仅供学习! 一.关系型数据库 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (At ...

  7. 分布式:ACID, CAP, BASE

    本文主要讲述分布式系统开发的一些相关理论基础. 一.ACID ACID是一系列对系统中数据进行访问与更新的操作所组成的一个程序执行的逻辑单元,狭义上的事务特指数据库事务. 1.Atomic原子性 事务 ...

  8. 分布式理论 之 CAP 定理

    -----------------------------------------------------入巷间吃汤面 笑看窗边飞雪. 目录: 什么是 CAP 定理 为什么只能 3 选 2 能不能解决 ...

  9. 分布式 基本理论 CAP 之 各分布式系统的cap支持情况

    分布式系统.理论.协议 非常非常多, 它们多cap 的支持是怎么样的呢? 需要注意的是,分布式系统 为了应付各种 复杂 应用场景,支持各种各样的功能,可能有的提供了选项或某种机制, 某个时刻,支持CP ...

随机推荐

  1. jumpserver篇--安装(高可用性 mariadb+haproxy)

    1. 需求 为了解决目前登陆方式多种多样,防火墙配置复杂,历史操作无记录,用户权限混乱等等 2. Jumpserver测试环境搭建 2.1. 环境 os:CentOS release 6.8 mini ...

  2. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  3. HAProxy负载均衡技术

    软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HA ...

  4. 一篇文章搞定SpringMVC参数绑定

    SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行 ...

  5. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  6. es6的let,const

    1.es6 新增的let const 命令 let用来定义一个局部变量,故名思意就是只在当前代码块可用 1.1 let 声明的变量不存在变量提升(var 声明的变量存在变量提升)且代码块内 暂时性死区 ...

  7. MIUI10系统怎么样刷成开发版获得ROOT权限

    小米的设备不同手机型号正常情况下小米官方论坛都提供两个不同系统,可分为稳定版和开发版,稳定版没有提供root超级权限管理,开发版中就提供了root超级权限,在很多工作的时候我们需要使用的一些功能强大的 ...

  8. python读取txt文件最后一行(文件大+文件小)

    txt文件小 #coding:utf-8 ''' fname为所读xx.txt文件 输出为:文件第一行和最后一行 ''' fname = 'test.txt' with open(fname, 'r' ...

  9. JavaScript中的高阶函数

    之前写的<JavaScript学习手册>,客户跟我说有些内容不适合初学者,让我删了,感觉挺可惜的,拿到这里和大家分享. JavaScript中的一切都是对象,这句话同样适用于函数.函数对象 ...

  10. MongoDB副本集及C#程序的连接配置

    1.副本集 高可用是绝大多数数据库管理系统的核心目标之一.如果要想生产数据在发生故障后依然可用,就需要确保为生产数据库多部署一台服务器.MongoDB副本集提供了数据的保护.高可用和灾难恢复的机制. ...