后刷的那一笔排在先刷的前面——东门闸机的核销流水错乱了 3 分钟。原因不在票务系统,是那台手持检票机的时钟慢了 40 秒。两笔间隔本来只差十几秒,被 40 秒一冲,先后就换了位置。当天没有一笔钱出错,出的全是顺序。
顺序错了会影响哪些判定
凡是要比先后的事都受影响。二次入园的判定看第一笔核销和后面那笔谁在前,位置一变,同一张票就从正常变成重复入园;分时容量看哪一笔落进哪个时段,跨期那一分钟的数会整体挪到下一个时段;到访率、超时核销的统计,还有客诉里那句"我到底进没进过",读的都是这个先后。金额不动,顺序动人更麻烦,因为两边都觉得自己那笔是对的,没有一个数能替谁说话。售票系统的核销明细也得按服务端那一刻重排一遍,两边报表对不上,客诉就成了各说各话。
以哪一刻为准
全链路以服务端时间为准。终端本地那一秒只用来在屏幕上显示和离线暂存,记录进票务系统落库时,落的是服务端收到这条记录的那一刻。这条规矩要写死在接口里:客户端上传的时间戳只当参考字段存着,排序、判定、报表一律读服务端时间。这么定,慢 40 秒的机子也打不乱顺序。终端每 10 分钟对时一次,对时从服务端的同步接口取,不认机器自己晶振走出来的那一路。

差多少要报警
偏差超过 10 秒报警、超过 60 秒停用该终端核销。报警要给到具体机位,别只写一句"某台设备时钟异常"——票务系统的设备状态表里带上机位编号和当时的偏差秒数,值班的人才知道是哪一台、要不要先撤下来。停用这一步不能省:60 秒以上的机子继续放,一天的流水里就掺进去一整天的错序,事后要一笔笔重排。判断是哪台机器慢了,拿它的流水和同一时段另一台闸机的记录比:两边条数对得上、时间戳整体错位,就是这台机器的钟。再具体一步,拿票务系统里这条记录的接收时刻,减掉售票系统明细上显示的本地时刻,差值就是这台机器偏了多少,不用跑现场去对表。
时钟这件事常年没人盯,因为它不报错。售票系统里对时失败的终端只留一行状态,一天没人进、没人查,就看不出问题。固定动作定成每天一次:拉一遍终端偏差清单,偏差不是零的排序,靠前的几台当天处理;连着几天都对不上时的,直接查它有没有接到同步接口,别只重启了完事。

例外单列一条:离线记录用本地时刻补传,须标注来源时钟。网络断掉期间只能拿机器本地那一秒,那就照本地时刻传,同时在票务系统的这条记录上写明它出自哪台终端的本地时钟、当时偏差多少、什么时候补传上来。报表里这一类单列一栏,只参与条数统计,不参与先后判定。不标注来源的离线记录最坑人——看着跟在线记录一模一样,一到排序的时候,谁也不知道它慢了。
