凌晨把新计费逻辑的开关置为 false,10 分钟内仍有 6% 的订单走新逻辑,金额算错 3 单。开关接口返回 false,实例日志里读到的是 true。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

curl http://app:9000/internal/switch/billing_v2
# 逐台确认返回 false
redis-cli DEL switch:billing_v2

开关值在本地缓存 10 分钟,推送只改了配置中心,没有主动清本地缓存。实例之间时钟有差异,部分节点的缓存还没到过期时间。这一点先确认清楚,后面就不用反复试。

「开关关闭未生效」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,开关变更走推送 收到后立即失效本地缓存;开关值不要长 TTL 最多 30 秒;关闭后旧逻辑保留一段时间 但要确认没有流量再删。

改完照着核一遍,开关关闭后 10 秒内所有实例都走旧逻辑,新逻辑的调用计数归零。

作者 9823189