从 0 开始学架构
李运华
网名“华仔”,前阿里资深技术专家(P9)
152573 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 66 讲
结束语 (1讲)
结课测试 (1讲)
从 0 开始学架构
15
15
1.0x
00:00/00:00
登录|注册

23 | 想成为架构师,你必须掌握的CAP细节

Eventual Consistency(最终一致性)
Soft State(软状态)
Basically Available(基本可用)
Durability(持久性)
Isolation(隔离性)
Consistency(一致性)
Atomicity(原子性)
分区期间可以进行操作,准备分区恢复后的一致性
分区未发生时同时满足CA
分区发生时选择CP或AP
忽略网络延迟
粒度是数据,不是整个系统
BASE
ACID
CAP理论
总结
CAP理论和ACID、BASE的关系

该思维导图由 AI 生成,仅供参考

理论的优点在于清晰简洁、易于理解,但缺点就是高度抽象化,省略了很多细节,导致在将理论应用到实践时,由于各种复杂情况,可能出现误解和偏差,CAP 理论也不例外。如果我们没有意识到这些关键的细节点,那么在实践中应用 CAP 理论时,就可能发现方案很难落地。
而且当谈到数据一致性时,CAP、ACID、BASE 难免会被我们拿出来讨论,原因在于这三者都是和数据一致性相关的理论,如果不仔细理解三者之间的差别,则可能会陷入一头雾水的状态,不知道应该用哪个才好。
今天,我来讲讲CAP 的具体细节,简单对比一下 ACID、BASE 几个概念的关键区别点。

CAP 关键细节点

埃里克·布鲁尔(Eric Brewer)在《CAP 理论十二年回顾:“规则”变了》(http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed)一文中详细地阐述了理解和应用 CAP 的一些细节点,可能是由于作者写作风格的原因,对于一些非常关键的细节点一句话就带过了,这里我特别提炼出来重点阐述。
CAP 关注的粒度是数据,而不是整个系统。
原文就只有一句话:
C 与 A 之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

CAP理论是分布式系统设计中的重要理论,着重关注数据一致性,而非整个系统的一致性。在实践中,需要根据不同数据的应用场景选择CP或AP策略,并注意网络延迟对数据同步的影响。此外,分区发生时只能选择CP或AP,分区恢复后需要使系统重新达到CA状态。ACID是数据库事务的理论,包含原子性、一致性、隔离性和持久性四个约束。而BASE理论是对CAP中AP方案的延伸,强调基本可用、软状态和最终一致性。这些理论对于正确应用分布式系统设计至关重要。综合来看,CAP理论关注数据一致性,ACID关注数据库事务完整性,BASE是CAP理论中AP方案的延伸。这些技术细节在架构设计中非常关键,对读者的理解和应用都具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学架构》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(69)

  • 最新
  • 精选
  • luop
    结合这两期对 CAP 的学习和思考,谈下个人的理解。 设计分布式系统的两大初衷:横向扩展(scalability)和高可用性(availability)。“横向扩展”是为了解决单点瓶颈问题,进而保证高并发量下的「可用性」;“高可用性”是为了解决单点故障(SPOF)问题,进而保证部分节点故障时的「可用性」。由此可以看出,分布式系统的核心诉求就是「可用性」。这个「可用性」正是 CAP 中的 A:用户访问系统时,可以在合理的时间内得到合理的响应。 为了保证「可用性」,一个分布式系统通常由多个节点组成。这些节点各自维护一份数据,但是不管用户访问到哪个节点,原则上都应该读取到相同的数据。为了达到这个效果,一个节点收到写入请求更新自己的数据后,必须将数据同步到其他节点,以保证各个节点的数据「一致性」。这个「一致性」正是 CAP 中的 C:用户访问系统时,可以读取到最近写入的数据。 需要注意的是:CAP 并没有考虑数据同步的耗时,所以现实中的分布式系统,理论上无法保证任何时刻的绝对「一致性」;不同业务系统对上述耗时的敏感度不同。 分布式系统中,节点之间的数据同步是基于网络的。由于网络本身固有的不可靠属性,极端情况下会出现网络不可用的情况,进而将网络两端的节点孤立开来,这就是所谓的“网络分区”现象。“网络分区”理论上是无法避免的,虽然实际发生的概率较低、时长较短。没有发生“网络分区”时,系统可以做到同时保证「一致性」和「可用性」。 发生“网络分区”时,系统中多个节点的数据一定是不一致的,但是可以选择对用户表现出「一致性」,代价是牺牲「可用性」:将未能同步得到新数据的部分节点置为“不可用状态”,访问到这些节点的用户显然感知到系统是不可用的。发生“网络分区”时,系统也可以选择「可用性」,此时系统中各个节点都是可用的,只是返回给用户的数据是不一致的。这里的选择,就是 CAP 中的 P。 分布式系统理论上一定会存在 P,所以理论上只能做到 CP 或 AP。如果套用 CAP 中离散的 C/A/P 的概念,理论上没有 P 的只可能是单点(子)系统,所以理论上可以做到 CA。但是单点(子)系统并不是分布式系统,所以其实并不在 CAP 理论的描述范围内。

    作者回复: 写的非常好👍👍

    2018-08-24
    26
    457
  • 空档滑行
    一个电商网站核心模块有会员,订单,商品,支付,促销管理等。 对于会员模块,包括登录,个人设置,个人订单,购物车,收藏夹等,这些模块保证AP,数据短时间不一致不影响使用。 订单模块的下单付款扣减库存操作是整个系统的核心,我觉得CA都需要保证,在极端情况下牺牲P是可以的。 商品模块的商品上下架和库存管理保证CP,搜索功能因为本身就不是实时性非常高的模块,所以保证AP就可以了。 促销是短时间的数据不一致,结果就是优惠信息看不到,但是已有的优惠要保证可用,而且优惠可以提前预计算,所以可以保证AP 现在大部分的电商网站对于支付这一块是独立的系统,或者使用第三方的支付宝,微信。其实CAP是由第三方来保证的,支付系统是一个对CAP要求极高的系统,C是必须要保证的,AP中A相对更重要,不能因为分区,导致所有人都不能支付

    作者回复: 分析思路很清晰

    2018-06-20
    5
    100
  • 刘毅
    CAP理解: 任何一个正常运行的分布式系统,起源于CA状态,中间(发生分区时)可能经过CP和AP状态,最后回到CA状态。 所以一个分布式系统,需要考虑实现三点: 1.正常运行时的CA状态。 2.发生分区时转变为CP或AP状态。 3.分区解决时变会CA状态。

    作者回复: 总结的非常好,第三点可以优化为“分区解决时如何恢复为CA状态”

    2020-06-16
    35
  • 乘风
    老师 你上面说redis集群是互联且数据共享,但按官网上说redis集群后,每个主节点的数据是不一致的,也不存在共享数据,现在对cap中指的分布式系统(互联且数据共享)还是不太明白,谢谢老师

    作者回复: 这里的共享是指同一份数据在多个节点都有,但并不一定在所有节点都有,简单理解有数据复制的系统就是CAP应用的场景。 一份数据在多个节点有但不是所有节点都有,这是非对称集群;例如ES 所有数据在所有节点都有,这是对称集群,例如zookeeper

    2018-11-30
    5
    29
  • xiao皮孩。。
    理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

    作者回复: 是的👍👍

    2019-04-02
    8
    25
  • 正是那朵玫瑰
    老师有个疑问,像电商这样的系统,有订单系统和库存系统,创建订单会调用库存系统,这两个系统是互联的,但是并没有数据共享,但超时的情况下,会造成订单数据和库存数据状态不一致,这种算不算cap讨论范畴呢?

    作者回复: 不算,CAP的应用范围已经明确了:互联,共享数据。 这种情况下的不一致靠对账,人工修复等方式解决

    2018-08-25
    21
  • 文竹
    电商网站核心功能有用户、产品、订单、支付、库存,相应的数据有用户、产品、订单、支付、库存。 对于用户数据,选择CP。因为用户注册后,可能几分钟后重新登录,所以需要满足一致性;在网络出现分区时,因为需要满足一致性而暂时不能提供写服务,所以无法满足可用性;对于分区容错性,只要能返回一个合理的响应就能满足,这一点能很好满足。 对于产品数据,无需满足一致性,所以选择AP。 对于订单数据,业务需要满足一致性,所以选择CP。 对于支付数据,业务需要满足一致性,所以选择CP。 对于库存数据,业务需要满足一致性,所以选择CP。

    作者回复: 思路很清晰👍👍

    2018-08-21
    16
  • 信信
    PACELC定理了解一下? 在理论计算机科学中,PACELC定理是CAP定理的扩展。它指出,在分布式计算机系统中,在网络分区(P)的情况下,必须在可用性(A)和一致性(C)之间进行选择(根据c a p定理),但是(E),即使系统在没有分区的情况下正常运行,也必须在延迟(L)和一致性(C)之间进行选择。 PACELC定理首先由耶鲁大学的Daniel J. Abadi 在2010年的一篇博文中描述,他后来在2012年的一篇论文中正式确定。PACELC的目的是声称他的论点“忽略复制系统的一致性/延迟权衡是一个主要的疏忽[在CAP中],因为它在系统运行期间始终存在,而CAP仅在可以说是罕见的网络分区情况下才相关。

    作者回复: 多谢👍👍

    2020-03-20
    12
  • zhouwm
    CAP理论延时问题:因为延时无法避免意味着完美CP场景不存在。—— 这个说法有问题,一致性是从外部使用者的角度去看的(黑盒),只要在回复应答前保障数据已经同步到其他节点,后续请求能得到新数据就是一致的,etcd就是完美cp,zk其实也能算完美cp。延时问题是系统设计的时候要考虑的点

    作者回复: 不会的,zk是顺序一致性,保证不了完美cp,raft为了可理解而简化了异常处理,某些场景下会丢失数据

    2018-07-24
    9
  • Han
    您提到CAP是要求各个节点都可以提供读写操作,但现在大部分的分布式中间件实现基本都是一主多从架构,只有主节点才会接收写请求,主从节点都能接收读请求。 而且很多一致性算法都是设定只有主节点才接收写请求,然后把数据同步到从节点。 请问您怎么看?

    作者回复: 这样做是通过限制主才能写来避免数据一致性问题,但是复杂度转移到如何选举主上去了,这就是大家普遍认为选举比数据一致性要简单一些😁

    2020-07-18
    7
收起评论
显示
设置
留言
69
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部