下游域名 TTL 是 60 秒,服务每秒发起两百多次解析,抓包看到 DNS 查询量跟着 QPS 一起走。进程内没有任何缓存。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,dns.lookup 走的是系统解析器,Node 自己不缓存,结果交给 libc 或操作系统的缓存策略,容器里常常是空的。TTL 到了之后每次调用都要重新问一遍。
「DNS 解析缓存」这类改动最怕改一半,回滚脚本先准备好,再动生产。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
const CacheableLookup = require('cacheable-lookup');
const lookup = new CacheableLookup();
https.get('https://api.example.com', { lookup }, res => res.resume());
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。
具体做法是,换 dns.resolve4 自己维护带 TTL 的缓存;或者用 cacheable-lookup 挂在 http.Agent 上;缓存过期前异步刷新 避免同时失效;确认容器里 resolv.conf 指向的 DNS 不是本地 stub。
最后用这个标准收尾,抓包里 DNS 查询降到每分钟个位数 接口耗时分布不再有解析抖动。
