一致性巡检每天报 200 多条「订单与支付不一致」,点进去全是刚创建几分钟、还在 PROCESSING 的单,运维后来直接不看这张报表。乍看像缓存或者权限的锅,追下去往往不是。
SELECT order_no, order_status, pay_status FROM order_pay_view WHERE order_status <> pay_status AND create_time < NOW() - INTERVAL 30 MINUTE;
追下去是这么回事:巡检 SQL 只要订单状态和支付状态不完全相等就算差异,没有排除还在处理中的中间态。真正的差异被淹没在误报里,告警失去了作用。
碰到「一致性巡检误报」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,巡检加时间条件 只查创建超过 30 分钟的单;中间态单独归一类 不进差异清单;差异按类型分组统计 数量突增才告警;每周抽样核对被归为正常的中间态 确认没有掩盖问题。
验收就看一点,巡检报告的差异条数从 200 多降到个位数 列出来的每一条都能人工确认为真差异。
