记录一下那天晚上的排查过程。新版本按实例灰度,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%,格式混排的反馈消失。
补一句。灰度要按用户而不是按实例切,实例数不等于流量比例,轮询还会让同一会话跨版本;分桶键写进网关配置,别藏着。这类问题最好一次改到位,反复小改反而容易把原因搅混。
