订单号用 yyMMddHHmmss 加三位序号,NTP 同步后系统时间从 10:23:45 回到 10:23:33。同一秒内两张订单拿到相同编号,插入时报 Duplicate entry。乍看像缓存或者权限的锅,追下去往往不是。
chronyc tracking timedatectl show-timesync --all date +%s.%N
追下去是这么回事:墙上时钟不是单调递增的,NTP 发现本地走快了就会往回拨。按时间戳拼业务编号的方案默认时间只前进,回拨或闰秒调整时就会撞号。
「NTP 时间回拨」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,编号改用发号器或数据库序列 别依赖系统时间;时间前缀只做展示 唯一性交给序号或雪花算法;NTP 配置平滑校时 尽量不要步进;编号列加唯一索引 冲突时第一时间发现。
验收就看一点,模拟回拨十秒后再下两单 订单号不同 唯一键冲突不再出现。
