记录一下那天晚上的排查过程。新版本按实例灰度,10 个副本里 2 个跑新版,负载均衡轮询把同一用户在不同实例间来回分,同一会话里回答格式一会儿新一会儿旧。

刚开始盯着「新版本改了输出格式,前端按两种格式都渲染」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。切流粒度是实例而不是用户。少数情况下是负载均衡没有做会话保持。

少数情况下是灰度比例按实例数算,实际流量并不均。

上来先确认同一用户是否落到不同版本

python -c "import json;d=json.load(open('req.jsonl'));print(len(set(r['uid'] for r in d)))"

然后改成按 uid 哈希固定分桶

python -c "print({'bucket':'uid_hash%100<10'})"

网关把版本写进响应头便于核对

python -c "print('X-Model-Ver')"

剩下的就是用同一 uid 连发 20 次验证稳定

python probe.py --uid u1001 --n 20 --check header

怎么算真的好了,看的是同一批现象。同一 uid 的 20 次请求全部落在同一版本,灰度用户占比稳定在 10%,格式混排的反馈消失。

补一句。灰度要按用户而不是按实例切,实例数不等于流量比例,轮询还会让同一会话跨版本;分桶键写进网关配置,别藏着。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189