译自A plain english introduction to CAP Theorem

可能你会经常听说在设计分布式系统的时候,有一套CAP理论限制,今天我们就试着通过一个现实中的解决方案来理解所谓的CAP。

Chapter 1: “记忆存储有限公司”——你的全新创业之旅

昨晚,你多年的配偶由于收到了你为他准备的生日礼物,对你还记得她的生日表示了极大的欣赏与感激,这使得你催生了一个奇怪的想法。人们总是不善于记住事情,但是你却对此非常擅长,所以为什么你不能用你的天赋来进行一次创业呢?你越想越觉得喜欢这个想法,甚至在你脑海中已经形成了发布在报纸上的广告语。

记忆存储公司!—— 完全不记也绝不会忘!
你曾有过因为忘记事情而感到悲伤吗?别担心,只需要一通电话,就可以解决这样的烦恼。
当你需要去记住一些事情的时候,只需要拨打135555REMEM然后告诉我们你需要记住什么。例如说,打给我们然后让我们记住你老板的电话,然后忘记它。当你需要知道它的时候,你只要再通过一样的电话135555REMEM打回来然后我们会告诉你你老板的电话是多少。
收费:每次服务仅需0.1元

因此,你通常的电话交流会类似下面这样:

Chapter 2: 公司业务增长

好消息,你的创业项目被YCombinator赞助了。你的想法太过于简单,除了一个电话和一个纸质笔记本之外再不需要别的东西,当你的业务像火一样蔓延开来的时候,你开始一天要处理上百个电话服务。

然后问题就出现了,你发现越来越多的客户需要在和你通电话之前排队,他们其中的大多数甚至因为等待的时间太长而挂掉了电话。除此之外,当你在某一天由于生病而无法工作时,你就丢失了一整天的生意,并且想想在那天需要从你这里获取信息的顾客有多么失望。

你决定是时候扩展你的业务能力了,于是你找来了你的妻子帮你。

你们商量了一个简单的计划:

  1. 你和你的妻子各有一部手机
  2. 顾客仍然拨打135555REMEM,但需要额外记住一个数字
  3. 一个pbx会将一个顾客的拨打平等的路由到你们其中空闲的人

Chapter 3: 创业路上的“第一道坎”

在你运作你的新工作模式2天之后,你从你的忠实客户Jhon那接到一通电话,通话如下:

Chapter 4: 修复一致性的问题

那么,你的竞争对手可能会忽略一次糟糕的服务,但是你不会,你想了这个问题一整晚,然后在早上得出了一个漂亮的计划,你把妻子叫醒然后告诉了她:

“亲爱的,从现在开始我们要这样做”

Chapter 5: 有史以来最完美的计划?

你开始慢慢意识到你的分布式系统可能没有你一开始想的那么简单。难道想出一个同时兼具一致性和可用性的方案就这么难吗?这对其他人来说可能很难,但是对你来说并不!接着第二天清晨你又想到了一个方案,而你的竞争者却在睡大觉,梦里可没有这样的方案!你又一次早早的叫醒了妻子..

"看",你告诉她,“我们这样做就能同时保证一致性和可用性。“新的方案和昨天我告诉你的非常相似:

Chapter 6: 妻子生气了!!!

新方案实施后的一段时间以内,一切都是那么顺利,你们的系统是一致的,甚至在其中一个人没有办法工作的时候也能正常运行。但是如果当你们两个人都工作的时候,你们其中有一个人不向另外一个人更新信息怎么办呢?想一想那些天你老早就把妻子吵醒,然后告诉她你所谓的充满漏洞的“完美计划”,如果这使得在某一天你的妻子虽然愿意接听电话,但是对你太过于生气,不愿意与你交谈并且同步更新怎么办?你的想法通通失效了!你的方案目前来看虽然是一致的和可用的,但是却不是**分区容忍(Partition Tolerant)**的!

你可以通过今天不接听任何电话而是哄妻子开心来实现解决分区容忍的问题..但是这样的话你的系统又没有办法正常运行了..

Chapter 7: 总结一下吧~

现在我们再来看CAP理论,他是这样说的,当你设计一个分布式系统的时候,你往往不能同时实现**一致性(Consistency),可用性(Availability)以及分区容忍性(Partition tolerance)**三者,通常只能保证其中的两个性质。

Bonus: 通过招聘新员工达成最终一致性

有另外一个值得深思的地方,你可以招聘一个秘书,他负责当你们其中一个人的笔记有更加新的信息的时候,更新其他人的笔记本。这样带来的巨大好处是,他可以在后台工作,因此你或者你妻子的更新操作不会由于等待对方的更新而被“阻塞”。这是很多NoSql系统的工作方式,一个结点在本地对自己更新之后,一个后台的进程将会逐步同步其他结点的更新,最终达到一致性。唯一的问题是,你们可能会在某些时候丢失一致性,例如,一个顾客的更新信息首先给到了你的妻子,在秘书在有机会对你的笔记本进行更新之前,顾客打回来电话并且被路由到了你这里,这样他就无法获得一个一致性的回复。但是如果这种情况并不会产生多大的影响,这就是一个不错的方案,比如说假设顾客不会那么快(例如5分钟之内)忘记事情然后打回来。

这就是CAP理论和最终一致性,通过大白话讲给你听。