Skip to content

分布式系统中的时钟:同步、顺序与期限 ​

修订于 2026-10-12:原文的电商扣款事故、未注明出处的漂移数字和通用告警阈值已删除。下文只讨论可验证的设计原则。

三种不同的问题 ​

**现在是几点?**日志、报表和对外显示需要墙上时间(wall clock)。各机器的本地时钟可能有偏差;同步服务能减小偏差,但不能把不确定性消除。

**过去了多久?**请求超时、任务期限和性能测量应使用系统提供的单调时间或期限机制。墙上时间可能因校时或人工调整而变化,不适合作为经过时间的唯一依据。

**哪件事先发生?**跨节点事件顺序不能只靠比较两台机器的本地时间戳。需要依据业务保证选择数据库事务、单调序号、因果关系标记或一致性协议。时钟同步与事件排序是两个不同问题。

NTP 能提供什么 ​

NTP 通过网络交换时间信息并估计本地时钟与时间源的偏差。估计受网络延迟及路径不对称影响。RFC 5905 描述了 NTPv4 协议和算法,但不能由此推出任意环境中固定的毫秒级误差值。

运维上应确认机器有可信的时间源,监测同步状态、偏移、抖动和时间源变更。告警阈值应由具体业务容忍度、时间源和环境测量决定,不能照搬一张通用表。涉及证书有效期、跨系统审计或到期计算时,应单独测试时钟异常和回拨。

TrueTime 不能简单复制 ​

Google Spanner 的 TrueTime 把时间表示为带不确定区间的结果,并将其用于事务时间戳和外部一致性。它依赖特定的时间基础设施和事务协议。应用在普通虚拟机上配置 NTP,不会自动得到 TrueTime 的保证。

设计检查清单 ​

  1. 为每个时间字段写明语义:事件发生时间、系统接收时间、提交时间、显示时间,不能混用。
  2. 跨服务传递明确的时区或统一时间表示;界面展示时再转换到用户时区。
  3. 超时与重试共享一个整体期限,并使用单调时间计算剩余预算。
  4. 需要严格顺序的业务由存储或协调协议保证顺序,不依赖“服务器时间差不多”。
  5. 注入时钟回拨、时间源失联、网络延迟和跨时区输入,验证告警与恢复流程。

参考资料 ​

梧桐和风 · 让复杂的技术讲得更清楚