CAP 理论 —— 最通俗的解释

CAP 理论是分布式系统的一个基础理论,它描述了任何一个分布式系统最多只能满足以下三个特性中的两个:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容忍性(Partition tolerance)

CAP 理论听起来十分抽象,本文尝试以生活中的例子并用通俗易懂的语言来解释 CAP 理论的含义。

第一章:“记忆公司”面世

一天晚上,正准备入睡时,你的妻子对你记住她生日并送她礼物表示感谢。这时,一个商业想法从你的脑海中闪现:人们总是弱于记忆生活中的事情,而我却拥有超群的记忆力,因此,为何不成立一间公司可以充分运用自己的记忆天赋来赚钱。说干就干,接着你在当地一间报社刊登了记忆公司的宣传广告:

记忆公司 —— 你的事情永不会忘记
还在为你老是忘记而苦恼?福音来了,只须一个电话。
当你需要记着某件事情时,请拨打 400 - 888 - 8888,告诉我们你需要记住的事情,下次你需要找回这件事情,请再次拨打电话,我们将会告诉你的所需。
收费: 每次只需要 10 元。

以下是一次你和顾客的电话对话。

  • 顾客:Hey,麻烦帮我记住我邻居的生日。
  • 你:好。你邻居生日是什么时候?
  • 顾客:1月2日。
  • 你:(在一个本子,翻到这位顾客的一页,记录下他邻居的生日。)好的,已记录好。下次你找回邻居的生日,请再次拨打电话。
  • 顾客:谢谢。
  • 你:不客气,本次收费 10 元。

第二章:业务扩大了

随着时间的推移,记忆公司的业务发展得越来越好,越来越多的顾客打电话进来需要服务。虽然赚到的钱越来越多,但也产生了一个新的问题。
顾客打电话进来时,需要等待的时间越来越多,另外,当你生病时,所有顾客都不能获得服务,这令人很是烦恼。
于是,你想出了一个新的计划:

  • 你和你的妻子同时接收顾客的电话
  • 顾客仍然只需要记着一个公司的服务电话 400 - 888 - 8888
  • 一个路由器会将顾客的电话分发到你和妻子电话上

第三章:服务出错了

新计划实施两天后,你接到了一个名叫 John 的电话,John 是个老顾客了。

  • John:Hey
  • 你:你好,欢迎拨打记忆公司电话,有什么可以帮到你吗
  • John:可以告诉我去新泽西的航班是什么时候吗
  • 你:当然。(然后你翻开 John 的页面,发现并没有 John 航班的记录)
  • 你:你好,是不是搞错了,我们这里并没有关于你航班的信息
  • John:什么?!昨天我才刚打电话过来说去新泽西航班的事情

哪里出错了?难道 John 撒谎了。你继续思考导致出错的原因。会不会是妻子接到了电话?你走到妻子的桌子,发现妻子将 John 的航班记录在了本子上,这时你才意识到导致问题的原因,妻子接听到 John 的电话,但你的本子没有 John 的记录。

如果将上面的实施计划称一个分布式的设计,那这个设计存在明显的问题——一致性(consistent)的问题。打进来的电话可能其中一人接听并记录下来,下次电话查询时却可能由另一人接听,这样就会出现不一致的问题,无法为顾客准确提供服务。

第四章:解决一致性问题

晚上你在床上翻来覆去,最后想到一个解决一致性问题的办法,你把新的计划告诉妻子:

  • 每次接收记录的电话(顾客要求帮忙记住他们的事情)时,我们同时告知另一个人
  • 这样,我们两个人都会在本子更新这位顾客的记录
  • 下次这位顾客再次打电话进来查询,这时我们不需要告知对方,因为两个本子都有这位顾客的记录了

这个方法只有一个问题,你告诉妻子,当有顾客需要记录时,我们不能并行地工作。例如,你接收到记录的电话并这个信息告知我,这时我就不能再接听其他顾客的电话了。但这个问题基本上也是可以接受的,因为大部分顾客的电话都是查询的。

老公你真聪明,妻子称赞你,但这个设计还有一个问题。如果某天我们其中一个人有事不能工作了怎么办?由于我们要求每次接到记录电话需要同时更新两个本子,这就导致我们不能为顾客提供记录的服务,这样就导致无法满足 可用性(availability)的要求。例如,当我接到一个记录的电话时,而你恰好不在,这样我就无法完成这个顾客的服务。这是由于我无法要求你更新你的本子。

第五章:更好的办法

这时你才意识到,设计一个分布式的系统是多么的不容易,难道就没有同时满足 一致性和可用性 的设计吗?
又经过一晚的思考,你想到一个两全其美的办法,新的办法跟之前的很相似。你把新的办法告诉妻子:

  • 当接到记录的电话(顾客要求为他们记录事情),如果我们两人当天都上班,那么我们同时记录下这位顾客的记录
  • 但如果另一人当天没上班,我们可以将记录通过 E-mail 的方式发送给不上班的人
  • 第二天,没上班的人上班后第一件事就是接收所有的 E-mail ,并在自己的本子上记录所有顾客的要求。记录好后,才开始接收第一个电话。

真是天才,妻子说,这个办法我找不出任何问题了,而且可以同时满足 一致性和可用性 的要求。

第六章:妻子生气了

公司所有业务继续正常运作了好一段时间,即使你和妻子其中一人不上班,服务仍然可以正常提供。
好景不长,新的问题又出现了。
一天,妻子由于某件小事对你很是生气,以至于她接到一位顾客需要记录的电话并没告知你。由于记录没能在两个本子更新,你的设计完全被打破了。你的设计建立在两人良好沟通的前提下,如果出现沟通无法进行的情况,系统就出现问题了。也就是说,你的设计没有达到 分区容忍性(partition tolerant)的要求。
当然,你也可以允许沟通无法进行的情况下继续提供服务。这样,当有顾客需要记录时,由于需要满足 一致性 要求,这位顾客的服务就无法完成,也就是 可用性 无法满足。。。

第七章:结论

让我们再次回到 CAP 理论,CAP 理论告诉我们,当设计一个分布式系统时,我们无法同时满足 一致性,可用性,分区容忍性 的要求,我们最多满足其中的两个要求,形式化的证明,可以参考 CAP 理论的证明 。

  • 一致性:一旦顾客更新了记录,下次再打电话查询时,总能获取最新的记录
  • 可用性:只要你和妻子有人上班,记忆公司总能为顾客提供服务
  • 分区容忍性:即使你和妻子的沟通无法进行,记忆公司仍然可以提供服务

番外篇:背后的记录员

上面设计的系统仍然有优化的空间。记忆公司可以雇佣一个记录员,当你和妻子其中一人接到顾客的记录电话时,记录员在背后会将这个记录写在另一个人的本子上。这样一来,另一个人的服务就不会被这个记录的电话打断。许多 NoSQL 系统就使用了这个方法,一个节点更新了数据,背后会有一个进程将数据同步到其他节点。
这种设计存在的问题是可能在短时间内丢失一致性。例如,顾客打电话进来要求记录,妻子接听到这个电话。紧接着,这位顾客再次打电话进来要求查询,你接听到这个查询的电话。如果记录员还没将这位顾客的记录更新到你的本子,这时顾客就没法正常查询。虽然存在这种可能性,但你也不用过分担心,因为顾客很少会打完记录电话后马上又打查询电话,所以出现本子内容不一致的概率很低。

参考资料

  1. http://ksat.me/a-plain-english-introduction-to-cap-theorem/
  2. http://robertgreiner.com/2014/08/cap-theorem-revisited/
  3. https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/

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

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

相关文章

QT信号与槽-启动系统程序以及相关控件介绍

1.1 创建一个继承至QWidget的项目。 1.2 设计界面,分析界面采用的布局方式。 首先,每行控件采用水平布局方式,第三行为了使控件靠右,前面添加一个占位控件。三行采用垂直平局;选中控件,通过右键可以控件的布局方式&a…

LeetCode 566 Reshape the Matrix 解题报告

题目要求 In MATLAB, there is a very useful function called reshape, which can reshape a matrix into a new one with different size but keep its original data. Youre given a matrix represented by a two-dimensional array, and two positive integers r and crepr…

科技部向全社会征集颠覆性技术研发方向

来源:人民网据科技部网站消息,为提升我国重大科技创新方向前瞻布局能力,加快推动颠覆性技术创新,科技部办公厅拟面向各有关单位和广大科研人员,开展颠覆性技术研发方向建议征集工作,对于符合条件的建议&…

springboot前后端分离项目MultipartFile获取前端传的file为null问题

【问题描述】 springbootvue 前后端分离项目,在对接上传文件功能时,一直显示文件为空。 【分析】 查找了很多博客,解决方法五花八门,但原因应该还是 springboot自带的org.springframework.web.multipart.MultipartFile和Multi…

计算机网络( 二十二)-数据链路层(补充)

1.链路link:结点------>相邻结点的物理线路。 2.数据链路:物理线路通信协议,通信协议(通信规程)用来控制数据的传输。 3.最常用网络适配器(硬件、软件)来实现协议。适配器包括了数据链路层和物理层两层的功能。 4.数据链路层的协议数据单元PDU------帧…

CF1129D Isolation(分块+DP)

一个很显然的DP方程式&#xff1a;f[i]Σf[j]&#xff0c;其中j<i且在[j1,i]中出现1次的数不超过k个 乍一看挺神仙的&#xff0c;只会O(n^2)&#xff0c;就是对于每个位置从后向前扫一遍&#xff0c;边扫边统计出现1次的数的个数。不难发现&#xff0c;同一个数第一次出现时…

《科学之路》| 图灵奖得主杨立昆人工智能十问:AI会统治人类吗?

来源&#xff1a;《科学之路》作者&#xff1a;杨立昆封面&#xff1a;Yukai Du即便是最先进的人工智能系统也存在局限性&#xff0c;它们还不如一只猫聪明。人工智能常常被认为是一项将要颠覆世界的技术&#xff0c;从这一概念诞生至今的65年中&#xff0c;无数电影与小说塑造…

计算机网络(二十三)-网络层-概述与数据交换方式

一.网络层的功能 主要任务是把分组从源端传送到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。 网络层传输单位是数据报。功能 路由选择与分组转发&#xff0c;最佳路径。异构网络互联&#xff1b;拥塞控制&#xff1b; 若所有结点都来不及接收分组&#xff0c;网…

数字大脑学术沙龙:“城市大脑与应急管理专题研讨会”成功召开

来源&#xff1a;城市大脑全球标准研究组2021年以来城市大脑的建设与研究获得了长足发展&#xff0c;数百个城市开展了城市大脑的建设与规划&#xff0c;取得了诸多成果。于此同时&#xff0c;伴随着疫情、水灾、交通事故、环境事故的不断出现&#xff0c;城市大脑如何应对应急…

SpringBoot集成MyBatis的分页插件PageHelper

【写在前面】 项目的后台管理系统需要展示所有资源信息&#xff0c;select * 虽然方便但数据量过于庞大会严重降低查找效率&#xff0c;页面加载慢&#xff0c;用户体验差。分页自然是必要选择&#xff0c;但原生的方法过于繁杂。MyBatis的分页插件PageHelper和SpringBoot的集…

Java 注解:@PostConstruct和@PreConstruct

从Java EE5规范开始&#xff0c;Servlet增加了两个影响Servlet生命周期的注解&#xff08;Annotation&#xff09;&#xff1a;PostConstruct和PreConstruct。这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。 使用方式&#xff0c;例如&#xff…

计算机网络(二十四)-路由算法及路由协议

1.1 路由算法 将最优的路径填入路由转发表。 1.2 路由算法分类 静态路由算法(非自适应路由算法)&#xff1a;管理员手动配置路由信息。 简便、可靠&#xff0c;在负载稳定、拓扑变化不大的网络中运行效果很好&#xff0c;广泛用于高度安全性的军事网络和较小的商业网络。 动…

研究速递:老年人的心智能力不一定在衰减,抗干扰的能力会更强

来源&#xff1a; 混沌巡洋舰长期以来&#xff0c;人们一直认为&#xff0c;衰老会导致我们的心智能力大幅下降。现在&#xff0c;乔治城大学医学中心的新研究&#xff0c;反驳这一观点&#xff0c;研究结果发表在2021年8月19日的《自然---- 人类行为》杂志上&#xff0c;由于世…

mysql 字段唯一性问题

ALTER TABLE tb ADD unique (name); 转载于:https://www.cnblogs.com/mlh1421/p/10478527.html

Java 的发展(历史)轨迹和历史变迁

Java的标准划分 Java 的版本演进到Java 2&#xff0c;根据不同层面的应用进行了细化&#xff0c;Java 2平台被分为三种版本&#xff0c;版本及其说明见 版本描述其它J2EE—企业版&#xff0c;适用于服务器&#xff0c;目前已成为企业运算、电子商务等领域的热门技术Enterprise…

计算机网络(二十五)-IP数据报格式

1.1 TCP/IP协议栈 1.2 IP数据报格式 IP数据报如果过大&#xff0c;就会对它进行分片&#xff0c;每个分片为一个分组。 版本指的是IPv4或IPv6&#xff1b;首部长度&#xff1a;单位是4B(4字节)&#xff0c;最小为5&#xff1b;区分服务&#xff1a;指示期望获得哪种类型的服…

NLP≠NLU,机器学习无法理解人类语言

来源&#xff1a;图灵人工智能 编译&#xff1a;吴彤校对&#xff1a;暮编辑&#xff1a;琰琰长期以来&#xff0c;我们一直在与机器沟通&#xff1a;编写代码--创建程序--执行任务。然而&#xff0c;这些程序并非是用人类“自然语言“编写的&#xff0c;像Java、Python、C和C …

CentOS 7 安装并启动Nginx

一、安装必要的库 1、安装gcc gcc-c yum install -y gcc gcc-c 2、gzip模块需要 zlib 库 cd /usr/local wget http://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./config make && make install3、重写模块需要pcre库 cd /usr/loc…

计算机网络(二十六)-IP数据报分片

一.最大传输单元MTU 1.1 数据链路层数据帧可封装数据的上限。以太网的MTU是1500字节&#xff1b; 1.2 当数据报超过了MTU&#xff0c;则进行分片&#xff1b; 1.3 分片-IP数据报格式 标识&#xff1a;同一数据报的分片使用同一标识&#xff1b;标志&#xff1a;只有两位有意…

论文速递:智能作为信息处理系统

来源&#xff1a;混沌巡洋舰圣塔菲研究院4月就智能的本质&#xff08;不管其是人类的&#xff0c;还是机器的&#xff09;举行的研讨会&#xff0c;旨在通过跨学科的整合来促进人工智能的发展。研讨会期间&#xff0c;来自不同学科的大牛聚集在一起&#xff0c;讨论如何将智力分…