【分布式理论】之 CAP



一、CAP


概念

CAP 有时也代表一致性,可用性,分区容错性,系统只能支持其中两个特性(CP 或 AP)。


(1) 一致性(Consistency)

A read is guaranteed to return the most recent write for a given client

客户端,保证读操作能返回大部分最近的写操作结果


(2)可用性(Availability)

A non-failing node will return a reasonable response within a reasonable amount of time(no error or timeout)

非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)


(3)分区容忍性(Partition Tolerance)

The system will continue to function when network paritions occur

当出现网络分区后, 系统能够继续 “履行职责”



二、避免使用 CAP


主要是 CAP 的局限性



为什么避免使用 CAP?

围绕着 CAP 有太多的误解与困扰,最后反而无法帮助我们更好地理解系统


(1) 只能在 CA 和 AP 中选择嘛?
  1. 在网络正常的时候,系统可以同时保证一致性(线性化)(C) 和 可用性(A)
  2. 在网络故障的时候,必须要么选择一致性(线性化)(C),要么可用性(A)

SO,CAP 忽略了网络故障。
即:选择 CA 和 AP,是根据实际情况(条件)下,所处的状态


(2) CAP 关注的是一个分布式系统嘛?

结论:CAP 关注的粒度是数据,而不是整个系统

一个系统可能处理只是一种数据,若包含多种类型的数据,有的数据必须选择 CP,有的数据必须选择 AP

比如:用户系统

  1. 用户基本信息数据(昵称、性别和自我介绍等等),选择 AP
  2. 用户帐号数据(用户ID、密码),选择 CP

(3) 一个系统的选择需要看实际情况

举个例子:

例如,现代多核CPU上的内存甚至就是非线性化(不一致性):如果某个CPU核上运行的线程修改一个内存地址,紧接着另一个CPU核上的线程尝试读取,则系统无法保证可以读到刚刚写入的值,除非使用了内存屏障或fence指令

出现这个情况的原因:

每个CPU核都有自己独立的 cache 和 寄存器。
内存访问首先进入 cache 系统,所有修改默认会异步地刷新到主存。
由于访问 cache 比访问主存要快得多,所以这样的异步刷新特性对于现代CPU的特性至关重要。
但,这就导致出现了多个数据副本(一个主存,另外几个在不同级别的 cache 中),而副本更新是异步方式,无法保证线性化

So,CAP 理论不适用与当今的多核-内存一致性模型:在计算机内部,我们通常假设通讯是可靠的,即不会假定一个CPU核在与其他核断开之后还能安然工作。

之所以放弃线性化(一致性)的原因:性能,而不是为了容错。

许多分布式数据库也是类似,它们选择不支持线性化是为了提高性能,而不是为了保住容错性



三、凡凡认为


  1. CAP 好处在于:指明了方向或指标,提供了这个几个角度,让人们去思考自己的系统

  2. 若太看重 CAP,被这个框住,可能会忽略其他细节(故障)。

  3. 有时跳出框架,从其他角度去看待系统,可能会有另一番收获。

  4. 理论应该成为我们的助推器,而不是约束器。



四、引用


  1. 《DDIA》
  2. 《从零开始学架构》
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值