zoukankan      html  css  js  c++  java
  • 【原创】分布式之大话CAP

    引言

    本文翻译自博客
    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理论,对照三个定义如下。可以发现,我们最多满足其中的两个要求
    一致性:一旦顾客更新了记录,下次再打电话查询时,总能获取最新的记录
    可用性:只要你和妻子有人上班,记忆公司总能为顾客提供服务
    分区容忍性:即使你和妻子的沟通无法进行,记忆公司仍然可以提供服务

  • 相关阅读:
    LeetCode 842. Split Array into Fibonacci Sequence
    LeetCode 1087. Brace Expansion
    LeetCode 1219. Path with Maximum Gold
    LeetCode 1079. Letter Tile Possibilities
    LeetCode 1049. Last Stone Weight II
    LeetCode 1046. Last Stone Weight
    LeetCode 1139. Largest 1-Bordered Square
    LeetCode 764. Largest Plus Sign
    LeetCode 1105. Filling Bookcase Shelves
    LeetCode 1027. Longest Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/rjzheng/p/10043054.html
Copyright © 2011-2022 走看看