知识卡片

时钟读数应被视为置信区间而非精确时间点

普通读书笔记卡

内容

即使能以微秒甚至纳秒精度读出机器时钟的数值,这个数值本身也很可能是不准确的——单靠 不精确的石英钟漂移,就算每分钟和本地NTP服务器同步一次,几毫秒的误差也很容易发生; 用公共互联网上的NTP服务器,最好情况也就几十毫秒精度,网络拥塞时误差可能超过100 毫秒。这意味着把某次时钟读数当成一个绝对精确的”时间点”是没有意义的,更准确的理解 是把它看作一段置信区间——比如系统可能以95%的置信度认为当前时刻落在某分钟内第10.3 秒到10.5秒之间,比这更细的数字(比如微秒位)基本没有实际意义。这个不确定性的大小 取决于具体的时间来源:如果有GPS接收器或原子钟直接连接主机,误差范围由制造商给出; 如果时间来自远程NTP服务器,不确定性要综合考虑上次同步后石英钟的预期漂移、NTP 服务器本身的不确定性、以及到服务器的网络往返时延(并且假设服务器本身可信)。但绝大 多数系统的时钟API根本不暴露这种不确定性——调用常见的时钟读取函数只返回一个具体 数字,不会告诉你这个数字的误差范围是5毫秒还是5年。Google的TrueTime API是个例外: 它不返回单一时间戳,而是返回[最早, 最晚]两个值构成的区间,明确承认”真实的当前时间 落在这个区间内某处”——这个显式的不确定性建模正是Spanner能安全实现跨数据中心快照 隔离的基础:如果两个事务的置信区间完全不重叠,就能确定它们的真实先后顺序;只有区间 重叠时才无法判断,Spanner的做法是故意在提交前等待整个置信区间的长度,确保后续事务 的区间不会和它重叠。

参考来源

- 位置:《数据密集型应用系统设计》第八章《分布式系统的麻烦》"时钟读数存在置信区间" "全局快照的同步时钟"(源文件:_epub-src/ch8_split_003.html) - 结论依据:原文说明时钟读数应被视为一段置信区间而非精确时间点,误差取决于时间源 (GPS/原子钟 vs 远程NTP),大多数系统不暴露这种不确定性,而Google TrueTime API 显式返回[最早,最晚]区间,Spanner据此在提交前等待置信区间长度以确保事务顺序正确, 直接支撑本卡片结论。 - 原始内容:因此,将时钟读数视为一个时间点是没有意义的——它更像是一段时间范围…… 一个有趣的例外是Spanner中的Google TrueTime API……当你询问当前时间时,你会得到 两个值:[最早,最晚]……Spanner在提交读写事务时,会故意等待置信区间长度的时间。