这是因为Lamport logical clocks没有capture causality(因果关系),而causality可以通过Vector Clocks来capture,用VC(a)来表示事件a的Vector Clock, 有如下性质:VC(a) < VC(b)可以推出事件a causally 发生在事件b之前(也就是事件a发生在事件b之前) 为每个进程Pi维护一个向量VC,也就是Pi的Vector Clock,这个向量VC...
https://juejin.cn/post/6844904147053969421
(理解这段话是很重要的,这正是Logical Clock的精髓所在。) 可以这么理解,Logical Clock解决的问题是找到一种方法,给分布式系统中所有时间定一个序,这个序能够正确地排列出具有因果关系的事件(注意,是不能保证并发事件的真实顺序的),使得分布式系统在逻辑上不会发生因果倒置的错误。 那么如何利用Happend-before关系来定...
而我们所说的Lamport clock是一种scalar clock,可以决定时序,但是任何的scalar clock并不能检测冲突.因为counter(A)<counter(B)并不能要求A操作先于B.所以在Lamport clock中即使产生并发,也有可能是有序的,无法检测到.这是dynamo系统不允许发生的,所以这类系统会考虑使用vector clock. vector clock有一个很大的缺点...
Vector Clock 但是Lamport Timestamp 不能很好的满足分布式系统,比如你不能区分两个事件是否有关联,或者在一个多点读的 key-value 数据库中,你无法确定保存哪一份副本(通常保存最新的那份副本)。 如下图所示,你其实无法单纯的通过 logic clock 比较来判断 Process 1 中的事件 3 和 Process 2 中的事件 8 是否...
这就需要借助Lamport大神在1978年提出的Logical Clock。 Happend-before关系 Lamport在文章中首先定义了一种关系,叫做Happend-before,我个人的理解是相当于因果关系,用->表示,比如a->b就叫做a Happend-before b,即b是由a引起的。 若两个事件a,b满足下面任一条件,则记作a->b: ...