昵称长度上限从 50 调到 20,发布当晚上游导入任务 3700 条全部失败,错误是 size must be between 0 and 20,对方值班到凌晨才发现是我们改了校验。日志里能对上时间点,这种反而好排。
校验规则属于接口契约的一部分,改动没有走变更通知。上游按旧文档构造数据,长度分布集中在 30 到 40 之间。规则收紧也没有灰度,直接全量生效。这一点先确认清楚,后面就不用反复试。
SELECT count(*) FROM upstream_user WHERE char_length(nickname) > 20; curl -s -X POST http://127.0.0.1:8080/api/users/import -d @upstream_3700.json
「校验规则变更」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。
处理上按这个顺序:把长度限制写进接口文档并标注版本和生效时间;收紧前先跑一遍存量数据 统计会失败的比例;给一个过渡期 超限只告警不拒绝;通知上游按新上限截断后再放开拒绝。
结果对不对很好判断,存量统计先拿到受影响条数 过渡期内导入返回 200 且响应里带超限告警数。
