阅读主题
第 31 章:顺序、因果与时钟
核心命题:时间戳、到达顺序与因果先后提供不同的证据。
本章任务
区分发生、发送、到达、处理和提交顺序;讨论时钟偏差、NTP 的边界、序列号、业务修订号与 Lamport 逻辑时钟。解释因果关系与人为全序的区别,识别需要排序的实体范围及乱序处理策略。
开篇场景
待写:取消消息先于创建消息被处理,日志时间又与依赖关系相反,该按什么恢复事实?
验证重点
时钟偏差、消息乱序、序列缺口和旧版本事件分别处理;时间戳相等或较小不能单独证明因果关系。
待编排素材:多机时钟与判定权威
从第一章移入,供本章后续成稿使用。
“服务端时间”也不是绝对可靠的同义词。它只是把信任边界放到了我们控制的一侧。多台服务的时钟仍可能有偏差。一次事件在 A 上记录,稍后被 B 接收,如果 B 的钟慢一些,日志中就可能出现接收早于发生的现象。
校时与时钟偏差监控是基础工作,但不能把“部署了校时”理解为“所有机器同时拥有完全相同的现在”。涉及扣费、截止边界或跨系统争议时,需要指定事实来源和判定方:以支付平台的确认时间为准,还是以本系统受理时间为准,应由规则决定。普通跨机时间戳也不能单独证明两个事件的因果顺序,这正是本章需要继续展开的问题。
例如 A 的时钟快 200 毫秒,B 慢 200 毫秒,消息实际传输了 50 毫秒,接收时间减发送时间却得到 −350 毫秒。把负数改成零会掩盖偏差,也会扭曲延迟分布。测量时应计入同步误差,或先测量同一台机器上的链路段。
两个事件的时间差落在时钟误差范围内时,仅靠这些记录不能证明先后。接下来需要讨论跨机排序和误差处理,而不只明确谁有权作到期判断。
对边界特别敏感的业务,可以集中由一个明确的判定方确认有效性。集中判断会带来延迟、容量和可用性成本,也不能把时钟变成绝对真理,但至少避免每台机器按自己略有偏差的现在独立给出冲突答案。是否值得付出这个成本,应该由允许的误差和失败后果决定,而不是由“服务器时间比较可信”一句话决定。