文章目录




一、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. 《从零开始学架构》