知识卡片
兰伯特时间戳:用(计数器,节点ID)构造与因果一致的全序
内容
兰伯特时间戳解决了[[非因果序列号生成器的三种方法及问题]]的核心缺陷,用极简手段构造出一个与因果一致的全序:每个时间戳是一对(计数器, 节点ID),比较规则是计数器大者更大,计数器相同时节点ID大者更大——这本身跟前述方案没什么不同。真正让它保持因果一致的关键机制是:每个节点和每个客户端都记录自己迄今见过的最大计数器值,并把这个值随每次请求/响应一起传播;一旦某节点收到的计数器值大于自己当前值,就立即把自己的计数器跳到这个更大的值。这样一来,任何因果依赖都必然会推高时间戳,保证了”若A因果早于B,则A的时间戳小于B”。它和[[用此前发生关系而非物理时间定义并发及版本向量的作用]]中的版本向量目的不同:版本向量能区分”两个操作并发”还是”一个依赖另一个”,兰伯特时间戳则总是给出一个全序、无法反推谁并发谁依赖,但它比版本向量紧凑得多,只需一对数字而非整个向量。
参考来源
- 位置:《数据密集型应用系统设计》第九章《一致性与共识》"兰伯特时间戳"(源文件:_epub-src/ch9_split_000.html)
- 结论依据:原文定义兰伯特时间戳为(计数器,节点ID)对,说明节点通过随请求传播并追赶最大计数器值来保持与因果一致,并与版本向量做对比说明两者用途不同,直接支撑本卡片结论。
- 原始内容:兰伯特时间戳就是两者的简单组合:(计数器,节点ID)……每个节点和每个客户端跟踪迄今为止所见到的最大计数器值,并在每个请求中包含这个最大计数器值……兰伯特时间戳优于版本向量的地方是,它更加紧凑。