Strong consistency models 学习笔记 首先线性一致性模型是最强的一致性模型它要求某个操作一旦完成后续操作立马就能看到结果并且所有操作看起来像是在某个瞬间原子执行的一样。线性一致性模型不仅要求顺序性还要求满足真实时间顺序。举例来说# 并发 a t1 write(x 1) t2 read(x) # 并发 b t3 write(x 2) t4 read(x)线性一致性是满足真实时间顺序的。如果write(x1)已经返回成功那么之后发生的读一定能够看到x1或更新的值而不会看到更旧的数据。虽然多个操作可能并发执行但最终结果必须能够解释成符合真实时间顺序的某种串行执行。因为是时间顺序执行所以模型需要加锁需要协调保证顺序性。对于多进程模型来说需要的成本就更高需要处理网络延时拥塞超时的情况也更多。比如 etcd 需要选举出 leader 由 leader 来保证到达的请求是顺序性的leader 需要沟通各个 follower 来保证结果是正确的。探讨过线性一致性模型后作者继续介绍了顺序一致性。相比于线性一致性其没有时间上的限制但是有顺序上的要求。作者举了 YouTube 上传视频的例子来说明异步系统中的顺序问题这里我用多线程访问共享变量来理解# 线程 A write(x 1) // 不一定是必须写成功可以成功可以不成功 read(x) # 线程 B write(x 2) // 不一定是必须写成功可以成功可以不成功 read(x)在顺序一致性模型中每个线程内部的操作顺序必须保持不变。例如线程 A 一定是先write(x1)再read(x)线程 B 一定是先write(x2)再read(x)。但是不同线程之间谁先谁后并没有时间上的要求。系统只需要保证最终结果能够解释成某种全局顺序即可而不要求这个顺序一定符合真实时间。顺序一致性相比于线性一致性放宽了对时间的要求因此实现时需要协调的内容也会少一些。接着到因果一致性这里相比于顺序一致性更加放宽了顺序的要求不要求所有操作都满足顺序执行只要求有因果关系的操作顺序执行。举例来说发朋友圈和点赞是满足因果一致性的要先发朋友圈才能点赞这是自然的因果逻辑。但是张三和李四发朋友圈并不需要顺序执行它们是无因果关系的谁在前谁在后并无影响。然后到了串形一致性Serializability这里有意思的点是它开始引入事务的概念事务内部必须保持顺序多个事务可以并发执行但最终结果必须等价于某种串行执行结果。换句话说串形一致性关注的是事务之间最终是否能够解释成某种串行顺序而不关心这个顺序是否符合真实时间。这个点很有意思文中举了例子加上笔者的理解如下# 事务 a print x if x 3 # 事务 b x 1 if x nil # 事务 c x 2 if x 1 # 事务 d x 3 if x 2在事务内的执行语句是按顺序执行的但是不同事物的执行顺序没有影响而且整个系统是可以解释成串形执行的具体说不管是哪个顺序运行这些事务最终都可解释为 nil - 1 - 2 - 3 这一个串最终结果肯定是 3。最后还有一种最终一致性模型虽然作者没有介绍但是感觉还是有必要说一下笔者理解的是不管顺序不管时间只要求最终结果是一致的当然这个最终的概念也是挺模糊的什么时候算最终呢有可能到时间的尽头...我们可以看下表在加深对上述几种一致性模型的理解模型全局顺序保证真实时间保证因果关系事务隔离Linearizability✅✅✅❌Sequential Consistency✅❌✅❌Causal Consistency❌❌✅❌Eventual Consistency❌❌❌❌Serializability事务级✅❌不关注✅不局限于上述几种一致性模型的介绍作者说了 CAP 理论我们最起码是我平时讨论 CAP 理论时说的 C 往往默认指线性一致性。那么如果降低一致性要求例如降低到顺序一致性或者串形一致性是不是就能同时满足 CAP 呢作者引用的论文给出的结论是即便降低到顺序一致性、串形一致性等模型依然无法做到完全可用Fully Available。只有进一步放宽一致性要求采用更弱的一致性模型才有可能获得更高的可用性。