用途:这是一份面向工程师的“时钟偏移陷阱”技能文档,用于防止因假设各机器时钟同步或单调而引入的缺陷。核心规则是:墙上时钟(Date.now()、time.time()、System.currentTimeMillis())用于日志、展示和人类可读时间戳;单调时钟(process.hrtime.bigint()、time.monotonic()、time.Since())用于时长、超时和耗时测量;分布式排序则用逻辑时钟。
主要能力与检测点:文档列出应停止并修复的误用,包括用 Date.now() 测量时长(NTP 调整可能使 end - start 为负)、跨机比较时间戳排序(偏移 50ms 而事件间隔 30ms 时无法确定顺序)、跨机共享绝对过期时间({ expiresAt: Date.now() + 60000 } 可能提前或延后过期)、用墙上时钟做 last-write-wins、用墙上时钟判断分布式锁过期、以及按时间戳邻近去重。
使用方式与模式:时长测量用单调时钟,且只在单进程内有效,不可跨机比较;系统间传递时长(秒、毫秒)而非绝对时间戳,例如用 redis.expire("session", 3600) 或 redis.setex(key, ttlSeconds, payload);跨机排序用 Lamport 逻辑时钟(tick/receive)或集中式序列生成器(数据库自增、Redis INCR);需要兼顾真实时间与因果顺序时可用混合逻辑时钟(HLC,CockroachDB 使用);分布式锁配合单调递增的 fencing token,由受保护服务拒绝过期 token。
适用场景:分布式系统、缓存过期、锁、去重、超时与限流窗口等对跨机顺序或精确时长敏感的逻辑。
限制:墙上时钟在仅用于日志、展示、分析或单机记录且不依赖跨机比较时是安全的;Lamport 时钟不能识别并发事件(需向量时钟);单调时钟不可跨机比较;文档未提供具体库版本、性能数据或完整部署步骤。