逻辑时钟与向量时钟

「A 事件发生在 B 事件之前」——这个简单的陈述,在单机系统里靠物理时钟就能判断。但在分布式系统里,每个节点都有自己的时钟,而时钟可能漂移(drift)、可能被人为调整、可能因为 NTP 同步而发生跳跃。用物理时钟判断事件先后,是不可靠的。

但分布式系统必须知道事件的先后顺序——因果关系依赖于此。比如「用户下单」和「扣减库存」,如果库存扣减发生在用户下单之前,就会出现「扣了库存但没订单」的错误。

逻辑时钟(Logical Clock) 提供了一种不依赖物理时钟就能判断事件先后的方法。Lamport 在 1978 年提出的 Lamport 时间戳,只需满足「如果 A 发生在 B 之前,则 L(A) < L(B)」这一条件,就能在没有全局时钟的分布式系统中建立事件的全序。

向量时钟(Vector Clock) 更进一步,它不仅能判断两个事件的先后关系,还能判断两个事件是否「可能有关联」——这是检测数据冲突(concurrent update)的基础。DynamoDB、Cassandra 这些最终一致性数据库,用向量时钟来判断「我的写入和你的写入是不是冲突的,应该保留哪个」。

本模块将深入讲解 Lamport 时钟、向量时钟的数学原理,以及它们在 Dynamo、Cassandra 中的实际应用。