curl http://10.0.3.13:9000/actuator/metrics/cache.gets?tag=name:configCache # 命中率 100% 说明一直读的是旧值 grep -i 'config refresh' /var/log/app/app.log | tail
改了一个限流开关,两台实例 30 秒内生效,第三台一直没变。日志里没有刷新记录,本地缓存的过期时间是 30 秒,但那台机器的定时任务线程池被占满,刷新任务排不上。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:配置读取走本地 Caffeine 缓存,过期靠调度线程回源。调度线程和业务共用同一个池,业务高峰时线程全被占住,缓存过期了也没有线程去加载。
「本地缓存配置过期」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:配置刷新用独立的调度线程 和业务线程池隔离;缓存过期后同步阻塞加载 不要依赖后台线程;加一条刷新延迟指标 超过 60 秒告警。
确认没问题再收工,改完配置后三台实例都在 5 秒内生效,刷新延迟指标的最大值不超过 2 秒。
