← 中文资源

简体中文版本

向量时钟

向量时钟跨节点追踪事件的因果关系,识别单一时间戳或计数器无法表达的并发更新。

阅读英文原文

没有全局时钟的因果

分区期间两个节点更新同一条记录。墙上时钟无法可靠判断谁先发生,因为时钟会漂移。向量时钟记录因果历史:每个节点一个条目,事件发生时递增本地条目,收到消息时按条目取最大值合并对方的向量。

A: {A: 1, B: 0}
B 收到 A 后更新: {A: 1, B: 1}
A 独立更新:      {A: 2, B: 0}

比较向量:第二个支配第一个(每个条目都大于等于,且至少一个更大),所以 {A:1,B:1} 发生在 {A:1,B:0} 之后。第三个与第二个不可比较:各自在不同节点上更大,因此更新是并发的。系统必须按定义好的规则合并或选择胜者。

冲突解决才是设计核心

检测并发只是一半。购物车可以合并商品,文档编辑器可以保留两处编辑,设置记录可以用最后写入获胜加决胜规则。这是产品决策。用任意时间戳掩盖它会静默丢数据。应存储冲突版本或合并值,并在自动合并不安全时向用户或运维暴露足够信息。

向量时钟随写入者数量增长。大系统中每节点一个条目会变得笨重。版本向量、带点版本向量和按 key 的时钟可以限制大小。如果系统能接受最后写入获胜,更简单的混合逻辑时钟可能足够;没有冲突策略就不要引入向量时钟。

何时使用

当并发更新可能发生、丢失更新不可接受,并且应用能定义合并策略时,使用向量时钟。优点是不依赖同步时钟也能准确表达因果;缺点是元数据大小和冲突处理复杂度。与单一时间戳相比更精确,但要求每个读写方理解比较规则。