这篇文章蓝本:http://ksat.me/a-plain-english-introduction-to-cap-theorem

经过小码甲意译、原创配图, 干到让你怀孕。


你可能经常听到CAP定理, 这个定理描述了在设计分布式系统时的天然约束。 就像其他文章一样, 本文以现实场景对比理解CAP定理。

1.记忆公司

昨晚你的老婆过生日,你这个渣男记得并精心准备了生日礼物,夫妇相视一笑。

一个天才创意在你头脑中产生: 既然人们的记忆里通常不好,而我偏偏擅长记忆,那我为什么不利用记忆天赋开创一番事业。

立马行动, 你制作了记忆公司的开业广告:

Remembrance Inc! - Never forget, even without remembering!

Ever felt bad that you forget so much? Don’t worry. Help is just a phone

away!

When you need to remember something, just call 555—55-REMEM and tell us

what you need to remember. For eg., call us and let us know of your

boss’s phone number, and forget to remember it. when you need to know it

back.. call back the same number[(555)—55-REMEM ] and we’ll tell you

what’s your boss’s phone number.

Charges : only $0.1 per request

记忆公司的日常业务通话记录:

  • 客户:喂,你好,你可以存储我邻居的生日吗?
  • 你: 可以,您说。
  • 客户:1月2号
  • 你:记录(在笔记本这个客户页上记下信息), 好的,欢迎下次垂询。
  • 客户:谢谢
  • 你: 请支持1元

2.业务扩张

凭借创意和人品,记忆公司的规模越做越大,而成本只需要笔记本和电话。

当你某天生病不能工作时,你会损失了一天的收入;更不用说当天想要信息的客户会因此发狂。

你有了新计划:

  1. 你和你老婆分别使用分机
  2. (555)—55-REMEM 客服电话不变
  3. 客服电话会转到空闲的分机号

3.第一次业务宕机

有一天你收到老客户罗志祥的电话,要求查询"明天的约会安排";

你一脸蒙蔽,我不知道啊,你的记忆页上没这个信息啊;

客户咣当挂断了电话。

当天复盘, 猜想是罗志祥昨天把业务电话打到我老婆那里了,事实确实如此。

你们都意识到分机号带来的新问题。

多么可怕的分布式设计中的缺陷!分布式系统是不一致! 总是会有一个时机,客户会将业务电话打到你们其中一个;在下一次拨号时,客户就可能收到不一致的信息。

4.修复一致性问题

睡前吹风时间, 你想到一个主意:

  • 当我们其中一个人接到客户新的记忆业务,我们会在挂电话之前告诉另一个人
  • 这样我们都能在笔记本上记下新业务
  • 当客户查询时,我们两个都可以轻松应对

这里有一个问题: 当其中一人收到新业务电话,两人就不能并行工作了。

例如:当你收到新业务并告诉我记录信息时, 我不能接其他电话。

但是这个问题也不大,因为大部分都是查询业务(可以再拨电话重试),我们首要的是确保信息正确。

你老婆进一步提出: 如果某天你不在岗,我收到新业务,你的笔记本不能得到最新信息,这就会有可用性问题, 因为我没能通知你,我就不能挂断电话完成这单业务。

5. 更优方案

你慢慢理解了分布式系统中的“一致性”和“可用性”。

你提出了更优方案:

  1. 收到新业务电话, 挂电话前通知对方,这样两个人都能记下信息
  2. 某天其中一人不在岗,另外一人收到新业务 ,发一封邮件
  3. 第二天上岗看邮件,另一人更新自己的笔记本。

Nice, 现在一致性和可用性都满足了。

6. 老婆难养

使用优化方案,一切都很顺利,你们的笔记本是一致的,当你们其中一人不在岗系统也能很多的运作。

但是, 凡是都有但是, 某天你们都在岗,但是你老婆嫌你碗没洗干净,今儿不想理你,收到新业务不通知你了,你的查询业务就有问题了。

你的方案包含了“一致性”,“可用性”, 但是不满足“分区容错”。

为了满足“分区容错”, 你可以自我下线(直到你们修复关系),让你老婆一人接手业务,但是你的系统就不可用了。

7.结论

我们回过头看CAP定理: 在设计分布式系统时,“一致性Consistency

”“可用性Availability”“分区容错Partition Tolerance” 你只能满足两个。

  • Consistency:一旦接受了客户的新业务,在客户后续查询时必须得到最新的信息
  • Availability:只要你们一人在岗,记忆公司就一直提供服务
  • Partition Tolerance:你们夫妻二人闹矛盾了,记忆公司依旧服务

雇佣工具人-->最终一致性

雇佣工具人,更新[未更新的人]的笔记本,相比你老婆实时通知你更新, 这个工具人有个好处是在后台跑腿,你们两个业务都不会阻塞。

这也是很多NoSql的工作方式:一个节点在本地更新,后台进程同步到其他节点, 唯一存在的问题是少数时候丢失一致性。

你老婆收到新业务,工具人还没来得及跑腿,客户就理解回拨并转到你的分机,你给出不一致的答复。这种情况有限,因为客户不会如此迅速忘记事情。

这就是CAP定理和最终一致性的 现实解释。

墙裂推荐:这可能是CAP理论的最好现实解释的更多相关文章

  1. 墙裂推荐4款js网页烟花特效

    以下是几款网页特效和一款软件: http://keleyi.com/keleyi/phtml/jstexiao/1.htm  http://keleyi.com/keleyi/phtml/jstexi ...

  2. Docker最全教程之Go实战,墙裂推荐(十八)

    前言 与其他语言相比,Go非常值得推荐和学习,真香!为什么?主要是可以直接编译成机器代码(性能优越,体积非常小,可达10来M,见实践教程图片)而且设计良好,上手门槛低.本篇主要侧重于讲解了Go语言的优 ...

  3. 墙裂推荐一波mysql学习资源

    在日常工作与学习中,无论是开发.运维.测试,还是架构师,数据库是一门必不可少的"必修课", 也是必备的涨薪神器.在互联网公司中,开源数据库用得比较多的当属 MySQL 了. 但my ...

  4. 如何从零开始参与 Apache 顶级开源项目?| 墙裂推荐

    ​ 写在开头 从 2021 开始,有一个很有意思的说法经常在各大技术媒体或开源论坛中出现,「开源正在吞噬一切」.不论是否言过其实,从一个行业从业者的切身感知来看,开源确实从少数极客的小众文化成为主流的 ...

  5. 墙裂推荐一本案例驱动的PhoneGap入门书,早看早收货

    清华大学出版社推出的<构建跨平台APP:PhoneGap移动应用实战> 零门槛学APP开发 从无到有 循序渐进 20余个示例APP 3个项目APP 全平台à跨终端à移动开发 完美生命周期: ...

  6. 【墙裂推荐】大学生如何学习WEB开发

    每天网络上有上万条Web招聘职位,招聘要求很简单: 会JavaScript,会CSS,能开发网页,能设计网页. 但我们真正面试时才发现:都是些很小很小的知识点! 我们没有实践过,没有碰到过,头脑一片茫 ...

  7. 墙裂推荐 iOS 资源大全

    这是个精心编排的列表,它包含了优秀的 iOS 框架.库.教程.XCode 插件.组件等等. 这个列表分为以下几个部分:框架( Frameworks ).组件( Components ).测试( Tes ...

  8. centos7用xshell可以连接, xftp连接失败!(墙裂推荐)

    环境: vultr vps搭建的是centos7  毛病: xshell可以连接, 打开xftp配置好连接却连接失败如下图: 然后开始设置ssh的配置文件vim /etc/ssh/sshd_confi ...

  9. JAVA面向对象面试题带答案(墙裂推荐)

    1) 在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用(c)关键字来申明父类的这些方法. a) Finalc b) Static c) Abstract d) Void2 ...

随机推荐

  1. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug

    集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值. ...

  2. http server源码解析

    本文主要过下http生成服务和处理请求的主要流程,其他功能并未涉及. 使用例子 const http = require('http'); http.createServer((req, res) = ...

  3. Ping 的工作原理你懂了,那 ICMP 你懂不懂?

    计算机网络我也连载了很多篇了,大家可以在我的公众号「程序员cxuan」 或者我的 github 系统学习. 计算机网络第一篇,聊一聊网络基础 :计算机网络基础知识总结 计算机网络第二篇,聊一聊 TCP ...

  4. 可以设置过期时间的Java缓存Map

    前言 最近项目需求需要一个类似于redis可以设置过期时间的K,V存储方式.项目前期暂时不引进redis,暂时用java内存代替. 解决方案 1. ExpiringMap 功能简介 : 1.可设置Ma ...

  5. 基于keras实现的中文实体识别

    1.简介 NER(Named Entity Recognition,命名实体识别)又称作专名识别,是自然语言处理中常见的一项任务,使用的范围非常广.命名实体通常指的是文本中具有特别意义或者指代性非常强 ...

  6. MySQL之九---分布式架构(Mycat/DBLE)

    MyCAT基础架构图 双主双从结构 MyCAT基础架构准备 准备环境  环境准备: 两台虚拟机 db01 db02 每台创建四个mysql实例:3307 3308 3309 3310 删除历史环境 p ...

  7. PAT-1119(Pre- and Post-order Traversals)+前序和后序遍历确定二叉树+判断二叉树是否唯一

    Pre- and Post-order Traversals PAT-1119 这题难度较大,主要需要考虑如何实现根据前序遍历和后序遍历来确定一颗二叉树 一篇好的文章: 题解 import java. ...

  8. Docker 三剑客 到 k8s 介绍

    一.Docker 三剑客 Docker-Compose Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启 ...

  9. Android之Parcelable解析

    http://www.cnblogs.com/abinxm/archive/2011/11/16/2250949.html http://www.cnblogs.com/renqingping/arc ...

  10. visual studio 2019 + cmake 实现windows linux跨平台开发环境搭建

    visual studio 2019开始支持cmake跨平台开发. 以前cmake项目需要先生成vs项目,然后vs直接使用vs项目开发.现在可以直接用vs2019创建或打开cmake项目. 使用vis ...