价格服务降级后读本地兜底 JSON,里面还是三天前导出的价格表。有 26 笔订单按旧价成交,最大一单差了 380 元,财务对账时才发现。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
jq '{generatedAt, count:(.items|length)}' /data/fallback/price.json
stat -c '%y %n' /data/fallback/price.json
兜底文件是上线时手工放的,之后没有更新机制,也没人负责。降级只保证接口不报错,没有校验数据的时间戳。这一点先确认清楚,后面就不用反复试。
「兜底数据过期」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,兜底数据带 generatedAt 字段 超过 24 小时就拒绝使用;写定时任务每天从主库导一份新的兜底文件;价格这类强一致数据降级时直接拒绝下单 不要用旧价;把兜底文件的生成时间打到监控上。
改完照着核一遍,兜底文件时间超过 24 小时时接口返回明确错误而不是旧价,监控能看到 generatedAt 的年龄。
