grep 'listening-30s' /var/log/app/config-client.log | tail -5
curl 'http://config:8080/configs?dataId=feature.json&md5=8f2a1c'
# 返回 304 说明 md5 没变 返回 200 说明有更新

11 点 20 分改了一个开关并发布,10 分钟内有 2 台实例仍是旧值,客户端日志停在 11 点 05 分的 listening-30s,之后没有任何请求记录。重启后立刻变成新值。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,长轮询的连接被中间的负载均衡按空闲超时掐断,客户端没有重连,也没有兜底的定时拉取。本地缓存的 md5 还停在旧值,服务端对比后认为没有变更。

「配置推送丢失」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

处理上按这个顺序:客户端加心跳和断线重连 至少 30 秒重试一次;再配一个 5 分钟的定时全量拉取兜底;服务端记录每个客户端最后拉取时间 超过阈值告警。

改完只确认一件事:断开长轮询后 5 分钟内实例自动拉到新配置,日志里出现一次 reconnect 和 md5 变化记录。

作者 9823189