滚动发布时新实例上线,前 10 秒内的请求 429 比例 78%,健康检查通过但业务请求全被拒。10 秒后恢复正常,每次发版都能复现。日志里能对上时间点,这种反而好排。

令牌桶初始令牌数为 0,按速率慢慢填充,冷启动阶段没有预热。发布时流量瞬间切到新实例,桶还没攒够令牌。这一点先确认清楚,后面就不用反复试。

curl http://10.0.3.21:9000/actuator/health
curl -s -o /dev/null -w '%{http_code}' http://10.0.3.21:9000/api/query
# 连续 10 次应当都是 200

「令牌桶冷启动」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:初始化时把桶填满 冷启动直接给容量上限;新实例先预热再摘流 健康检查通过后等 10 秒;限流组件启动日志打印初始令牌数 方便核对。

结果对不对很好判断,新实例上线后立刻发 50 个请求全部 200,429 只在超过阈值后出现。

作者 9823189