知识卡片

一致性定义的精确化:从"节点同时可见"到"客户端读到最新写入"

普通读书笔记卡

内容

承接[[CAP理论适用范围的精确化:互联且共享数据的读写系统]],一致性(Consistency)的定义也经历了从粗糙到精确的演变。第一版表述是”所有节点在同一时刻都能看到相同的数据”(All nodes see the same data at the same time),第二版改为”对某个指定客户端来说,读操作保证能返回最新的写操作结果”(A read is guaranteed to return the most recent write for a given client)。两版差异体现在三个层面:一是视角从”节点”转向”客户端”——第二版站在客户端观察系统行为的角度描述,更贴近我们实际评估一个系统的方式;二是关键词从”see”换成”read”——严格说节点是”拥有”(have)数据而不是”看到”(see)数据,”see”这个词本身用词就不够准确,第二版改用客户端的”读”操作来定义一致性反而更精确;三是第一版强调”同一时刻拥有相同数据”(same time + same data),第二版完全没有强调这一点,这意味着实际上节点之间完全可能出现”同一时刻数据不同”的情况——这一点乍看和我们通常理解的”一致性”有出入,但原因在第一版更详细的解释里其实已经埋下伏笔:一个系统在事务开始时是一致状态,事务结束时也应回到一致状态,但事务执行过程中系统是可以(也确实会)短暂进入不一致状态的,只要出错就整体回滚即可。换句话说,事务执行期间不同节点的数据本来就可能暂时不一致,这恰恰说明第一版”所有节点同一时刻数据相同”这个表述是不严谨的;而第二版只强调客户端的读操作要拿到最新写入结果就完全站得住脚——因为事务执行期间客户端本来就读不到未提交的数据,只有事务真正提交后客户端才能读到写入结果,事务失败则会回滚、客户端同样不会读到中间状态的脏数据。

参考来源

- 位置:《从零开始学架构》第22讲《想成为架构师,你必须知道CAP理论》"一致性(Consistency)"(源文件:_epub-src/OEBPS/text00002.html) - 结论依据:原文对比第一版"All nodes see the same data at the same time"与第二版"A read is guaranteed to return the most recent write for a given client",指出"节点是拥有数据,而不是看到数据……第二版从客户端 client 的读写角度来描述一致性,定义更加精确",并引用第一版详细解释说明"系统可以(并且确实)在事务期间转变为不一致状态,但如果在此过程中的任何阶段发生错误,整个事务都会回滚",说明"事务执行过程中,系统其实处于一个不一致的状态,不同的节点的数据并不完全一致",直接支撑本卡片结论。 - 原始内容:第一版从节点 node 的角度描述,第二版从客户端 client 的角度描述……在事务执行过程中,系统其实处于一个不一致的状态,不同的节点的数据并不完全一致,因此第一版的解释"All nodes see the same data at the same time"是不严谨的。