简单理解CAP理论

分布式系统设计时经常提到CAP理论,下面对比真实世界来说明CAP理论。

1. “记忆公司”你的新事业(一个存储服务)

昨天你老婆非常开心,你能记得她生日还送给她生日礼物;突然你发现一丝商机,人们总忘记重要的事儿,而你的记忆力这么棒,干脆开个公司专门给人记录重要的事情。然后你还打了个广告;

记忆公司-永远不会忘记
- 你还在为健忘苦恼么,我来为你解忧
- 只需拨打555-555-555,告诉我们你需要记住的事儿,比如你老板的电话,你只要告诉我们,然后你可以彻底忘掉他糟糕的号码,需要时打个电话问我们就好了;
- 每次只需1分钱,

日常情况是这样的:
顾客:帮我存个邻居的生日
我:那天
顾客:1月2日
我:(写在小本本上)存储好了,需要时打给我就好了
顾客:感谢
我:不客气,本次收费1毛钱

2. 扩张(横向扩容,负载均衡)

你的企业蒸蒸日上,融资成功。你的想法很简单,只需要一个纸笔记本和一个电话就可以应付。不过,你开始每天接到数百个电话。
问题:1)越来越多的顾客不得不排队等着和你说话。他们中的大多数人甚至厌倦了等待。2)前几天你生病不能来上班,损失了一整天的生意。客户根本等不起。
你决定是时候扩大规模,让你的妻子来帮助你。

  • 你和妻子一人一个分机
  • 客户还是只需拨打555-555-555即可,只记录一个分机号
  • 内网专用电话交换机把平等地把请求打给空闲的分机

3.第一个差评(一致性问题)

在实现新系统的两天后,您接到了一个来自您信任的客户Jhon的电话。事情是这样的: …

客户查询一条记录-飞机起飞时间
你却从本子上查不到
客户明明是昨天存储的,哦,当时是妻子处理的这个请求

不的分布式设计中有重大缺陷!分布式系统不一致!客户随时都有可能更新给你或你妻子的信息,而当客户的下一个电话被转接到另一个人时,记忆公司会给出不一致的回复。

4. 修复一致性问题

你的解法:系统收到update请求(写操作),你和妻子都要互相通知另外一个人,两个人都要记录更新的记录(如果通知不到,就一直阻塞在那里)。这样下次客户查询时,肯定会查到最新的内容。
一致性:读操作得到最新数据或者错误
虽然修复了一致性问题,还有两个问题:

  1. 我们更新时,无法并行处理,不过如果读多写少的情形,其实还好。
  2. 可用性:如果我们中的一个人某一天不去上班怎么办?那么,在那一天,我们将无法接听“任何”更新电话,因为对方无法更新!我们会有可用性问题;及时你已经记录成功,但是妻子没有反应,这个请求会一直阻塞。
    C和A是冲突的。

5. 你想到了最好的办法(最终一致性)

1)当我们中的任何一个人在完成通话前接到更新电话(此次是写请求),如果对方有空,我们就告诉对方。这样我们都能记下任何更新
2)但是如果另一个人不在(没上班),我们会给另一个人发一封关于更新的电子邮件。
3) 第二天,当对方休息一天后来上班时,他首先查看所有的电子邮件,并相应地更新他的记事本。在接第一个电话之前。
天才!你妻子说!我找不到这个系统有什么缺陷;现在是一致的和可用的!
最终一致性和可用性可以共存

6. 妻子生气了,后果很严重(不是分区容忍)

有段时间一切都很顺利。你的系统是一致的。即使你们其中一人不上班,你们的系统也能正常工作。
但是,如果你们两个都去上班,而其中一个不向另一个人汇报情况呢?还记得那些日子吗?你总是用你最伟大的想法——废话——早早地把你的妻子吵醒。*如果你的妻子决定接电话,但对你太生气了,决定一天不更新你的近况,怎么办?你的主意完全行不通!到目前为止,您的想法是好的一致性和可用性,但不是分区容忍
在和妻子和好之前,你可以决定不接任何电话,这样你就可以对彼此的划分保持宽容。那么您的系统在此期间将不可用……
分区容忍 - 部分节点网络失败时(partition),系统仍然可以正常运行

7. 结论

CAP只能保全两个,分区容忍是分布式系统必须的,所以CP/AP
一致性:您的客户一旦与您有了更新的信息,在后续的通话中总是会得到最新的信息。不管他们多快回电话
可用性:在您(您或您的妻子)中的任何一个人(您或您的妻子)上班之前,记忆公司将一直为您提供电话服务。
分区容忍:记忆公司会继续工作,即使你和你的妻子之间有沟通损失!

福利:跑腿的小职员和最终一致性

这是另一个值得思考的问题。你可以找个跑腿的职员,当你或你妻子的笔记本更新时,他会帮你更新其他人的笔记本。
这样做最大的好处是,他可以在后台工作,而你或你妻子的一个“更新”不必阻塞,等待另一个更新。这就是NoSql系统的工作方式,一个节点在本地更新自己,一个后台进程相应地同步所有其他节点……唯一的问题是,您将在一段时间内失去一致性。
例如。在美国,顾客的电话先打到你妻子那里,在店员有机会更新你的笔记本电脑之前,顾客的电话又打到你那里。那他就得不到一致的答复了。但即便如此,如果此类案件受到限制,这也不是一个坏主意。如。假设一位顾客不会因为忘东西太快而在5分钟内打电话回来。
一个专门的同步服务,在后台异步的同步节点之间的数据,达到最终一致性
http://ksat.me/a-plain-english-introduction-to-cap-theorem/

你可能感兴趣的:(系统设计)