两块表盘并排立着,一块显示线路连通的指示针稳稳指在高位,另一块的指针停在一条数字的年龄刻度上

一、接口活着与这条数几岁,是两套指标体系

跨境结算与对账场景里,汇率数据出的事故,多数不是“接口挂了”这种形态。更常见的现场是:接口通着,取数成功,数值落在合理区间,报表照出,钱照算——只是这条数在它该被使用的那个时点已经太老了,而系统里没有任何一个指标能回答“它几岁”。

三个典型现象都源于此。其一,源侧的更新延迟不表现为故障:发布停了,接口还在正常返回,返回的就是旧值,健康检查全绿。其二,不同来源的报价基准与发布时点本就不同,同一天并排放着就是两条不一致的数,谁也没错,可比性却是假的。其三,下游取数时把“末次可用值”当成“当日应使用值”,两者在源侧正常的日子里几乎相等,只有在延迟发生当日才分家,事故也专挑延迟发生的场景来。

可用性监控回答的是“服务还在不在”,结算正确性回答的是“这条数在该被使用的时间点几岁了”。这是两套指标体系,前者管不了后者。数据的年龄应当是一等属性,从落库那刻起就存在,不是排障时才想起来的补充字段。围绕这个判断,要落的规范共四项,下面按顺序展开。

二、规范一:落库就把两个时间戳写全

第一个时间戳是业务生效时间:这条数适用于哪一天、哪一时点,由来源侧的报价基准决定。第二个时间戳是获取时间:我方是什么时候拿到它的,由我方同步作业决定。两个都不能省,因为它们各自支撑一类判断,缺哪个就瞎哪只眼。

只有获取时间、没有生效时间时,人会把获取时间当生效时间用。后果是源侧延迟被从年龄里洗掉了:一条在源头早就定版的数,入库时刻却是新的,年龄算出来很小,过期判断全部失真,那段真实的延迟又被间接算到使用环节头上,等于重复计入一次。只有生效时间、没有获取时间,则反过来——把生效时间当获取时间看,源侧延迟就看不见了:数据迟到和来源没发布这两种情形,在单时间戳里长得一模一样,分不清是我们同步慢了还是对方停了。

双时间戳的价值就在这句上:它把“数据本身多大”和“数据从源头走到我们要多久”拆成两个可分别观察、分别告警的量。落库时两个字段都设非空,验收时回查任一条记录都要求两值俱在、可追溯,事后补写的时间戳一律视为无效记录。

三、规范二:年龄按数据类定标,陈旧告警单独成线

数据年龄的定义要先定基数:用当前时刻减去业务生效时间。也有系统用获取时间算,那测出来的其实是“我方搬运用了多久”,是同步链路的指标,不是数据的属性。口径必须先选定再谈阈值,两个都想要就各存一个指标,不许一个字段两个含义。

不同数据类的合理年龄上限不同,定标方法是从各自动作对时点的要求回推,而不是拍一个全局数。日内结算的容忍最小,年龄只要跨过本轮结算批次时点,这条数就完成了使命,旧的批次值没有继续使用的余地;日终对账以终场定版时点为界,要的是“日终定版用的是哪个值”,对搬运快慢反而敏感;历史回溯不以新鲜为要求,它要回答的是“当时用的是什么”,年龄在那里不是告警对象,而是审计对象。统一阈值必然同时制造误报和漏报:一条数对日内结算已经老得不能用,对历史回溯恰恰就是需要的那一条。

陈旧告警与故障告警必须分列。接口健康但数据陈旧是一类独立告警,要有单独通道;混进可用性告警里,它会被“接口没挂”这句话当场处理掉。这条告警的三个必含要素:哪条数据类在变老、当前年龄与上限各是多少、影响到的下游范围到哪一层——三样缺一,值班的人就没法决定该动谁。升级路径写三级:提示值班核查;核查无果则暂停依赖该数据类的结算批次;恢复放行必须人工确认并留操作记录,不允许等数据自己“追上来”。

四、规范三:软过期与硬过期,判定顺序和沿用事实的落位

双层过期的分工:软过期指数据超出建议年龄但还没到禁止线,可以继续用于低风险场景,前提是结果里带上过期标记,让拿到结果的人知道自己在用旧数;硬过期指超出允许上限,禁止用于结算,并且必须触发兜底动作。

判定顺序是先查硬、再判软,硬过期的禁用优先级压过软过期的标记可用。两者是包含关系而不是并列关系——顺序写反了,同一条记录会既被标记“低风险可用”又被禁止结算,下游拿到的是自相矛盾的指令。

硬过期的兜底只有两种选择:沿用上一条有效值,或者中止。选哪种要按数据类事先定死,不在事故当场临场决定。选了沿用,麻烦在“沿用”这个事实记在哪:仅写日志等于没写,日志是给我们自己排障用的,看不到它的人才是用数据的人。沿用的事实要落进数据记录自身的字段——用哪一条、原定的那条为什么被跳过;同时在对外报表的脚注出现,让读报表的人知道这一格是沿用值。选了中止,中止原因要作为结果的一部分落库,而不是只剩一条运维日志。

五、规范四:多源切换时,口径标注随数据落库,取数接口自带口径

多源不一致的根子在口径:不同来源的报价基准、发布时间、换算方向都不一定相同。所以来源切换时,口径标注是落库义务,不是文档义务。四个维度必须随每条数据一起写进表结构并可回读:

维度 要回答的问题 缺失时的错误形态
来源 这条数是谁给的 切换之后,历史数据无法解释数值为何变化
报价基准 按什么口径定的价 两个来源的数值各自合理,放在一起不可比
发布时间 源侧何时定版 与生效时间口径打架,年龄算不清
换算方向 谁兑谁、还是反向 取倒数错误要到对账差异里才能暴露

切换动作三条。第一条,不并行覆盖而是分列:同一时点两个来源的数各存一条,哪条生效由口径字段决定,不由“后来者覆盖先来者”决定。第二条,切换前后各留一段对照期:两个来源并行落数,差异只出对照报表,不进出结算。第三条,在报表上把切换点显性标出:读到数值跳变的人要能看见“这里是来源切换”,而不是误判成行情本身动了。

与切换配套的还有下游取数的两条规则:数据服务必须能分别回答“当日应使用值”和“末次可用值”,且返回结果自带所用口径,不能让调用方猜。取数接口最少要带三个字段:值、生效时间、口径标识。宁可值暂时缺供并明示,也不能只给一个裸数——裸数把口径判断推给了每个调用方,等于把口径分裂放大成若干份。

六、五项验收

四项规范加取数规则落完,验收按五条判,每条都要能判出通过与否:

  1. 双时间戳:任取记录回查,两个时间戳均非空、可追溯,且无事后补写的生效时间混入;
  2. 年龄指标:能按数据类出分布,看得到尾部而不只是平均值;
  3. 陈旧告警:能在接口零故障的场景下触发一次演练留痕,走独立通道,告警内容带齐三个必含要素;
  4. 过期处置:抽一条硬过期记录,确认它没有进入结算结果;抽一条沿用记录,确认沿用事实在数据字段与报表脚注两处都能见到;
  5. 切换可解释:任取切换时点前后各一条记录,四个口径维度完整,报表上切换点有显性标记。

这五条里最容易被省略的是第三条的“零故障触发”——不演练这一次,陈旧告警和故障告警分不分列没人说得清,而事故只会挑那条没演练过的路径来。洹拓在这类数据链路上把“这条数几岁”当成与“接口通不通”平级的问句:结算正确性的账,从来都是从年龄算起的。