知识卡片

CAP应用:为何CA架构不存在,及CP与AP的具体区分

结构图卡

内容

CAP理论说三者只能取二,但放到真实的分布式环境下推演会发现:P(分区容忍性)其实是无法放弃的必选项,因为网络本身做不到100%可靠,节点间出现分区是必然会发生的现象,不是”要不要接受”的问题。如果强行选择CA、放弃P,会出现自相矛盾:一旦真的发生分区,为了保住一致性C,系统只能对写请求返回错误(禁止写入),但返回error本身就直接违反了可用性A(A要求不能出现error、不能超时)——所以理论上分布式系统根本不存在真正意义上的CA架构,能选的只有CP或AP。CP(Consistency/Partition Tolerance)架构的做法是:假设N1和N2两个节点间的复制通道因为分区而中断,N1上的数据已经更新到y,但还没能同步给N2,此时客户端C如果去访问N2,为了不返回过期的旧数据(保证一致性),N2会直接返回Error告诉客户端”系统当前出错了”——这个处理方式本身就是在牺牲可用性去换取一致性,因此这类架构只能满足CP。AP(Availability/Partition Tolerance)架构的做法则相反:同样是N1已经更新到y但还没同步给N2,客户端C访问N2时,N2直接把自己当前拥有的旧数据x返回给客户端,而不是报错——这就不满足”客户端读操作要拿到最新写入结果”这个一致性要求了,因此这类架构只能满足AP。这里有个细节值得注意:AP架构里N2返回的旧值x虽然不是一个”正确”的结果,但依然是一个”合理”的结果——它是一个真实存在过的、没有错乱的旧数据,只是不是最新的而已,这正好呼应了[[可用性定义的精确化:合理响应不等于正确响应]]里”合理不等于正确”这个精确定义。选CP还是选AP,本质上是架构师针对具体业务场景,在”宁可报错也不给旧数据”和”宁可给旧数据也不报错”之间做的取舍。

结构图

flowchart TB
  A["分布式系统必须接受P<br/>网络本身无法100%可靠,分区是必然现象"]
  A --> B["若强选CA:分区发生时<br/>为保C只能对写请求报错→违反A<br/>→CA架构理论上不存在"]
  A --> C["CP:牺牲可用性保一致性<br/>N2数据未同步到最新时直接返回Error"]
  A --> D["AP:牺牲一致性保可用性<br/>N2直接返回自己现有的旧数据x(非最新但合理)"]
  D --> E["旧数据x虽不'正确'但是'合理'的响应<br/>呼应可用性定义中'合理≠正确'"]

参考来源

- 位置:《从零开始学架构》第22讲《想成为架构师,你必须知道CAP理论》"CAP应用"(源文件:_epub-src/OEBPS/text00002.html) - 结论依据:原文说明"必须选择 P(分区容忍)要素……如果我们选择了 CA 而放弃了 P,那么当发生分区现象时,为了保证 C,系统需要禁止写入……这又和 A 冲突了……分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构",并分别以N1/N2节点场景说明CP"N2需要返回 Error……这种处理方式违背了可用性(Availability)的要求"和AP"N2将当前自己拥有的数据 x 返回给客户端……这就不满足一致性(Consistency)的要求了……但是一个'合理'的结果",直接支撑本卡片结论与结构图。 - 原始内容:分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构……N2 需要返回 Error……这种处理方式违背了可用性(Availability)的要求,因此 CAP 三者只能满足 CP……N2 将当前自己拥有的数据 x 返回给客户端了……这就不满足一致性(Consistency)的要求了。