2024-10-23 15:56:52
在进行 DNS 服务器切换升级演练时,我们遇到使用 NodeJS 中 axios 和默认的 dns.lookup 存在的问题,导致响应耗时急剧上升至约 3分钟,最终导致 nginx 层出现大量 502 错误。具体分析参见《node中请求超时的一些坑》。
总结所述,NodeJS DNS 的“坑”主要涉及以下几点:
1. 优化方案:在不修改 NodeJS 底层源码的情况下,在 JS 层引入 DNS 缓存,这是一个轻量级的优化方案,能一定程度上规避上述问题,但并非完美解决方案。考虑到引入 lookup-dns-cache 作为优化方案。然而,在引入 DNS 查询与缓存时,线上操作前需谨慎确认以下问题:
2. dns.resolve* 是否使用 resolv.conf 配置?在 NodeJS 中,dns.resolve* 方法通过 c-ares 库进行 DNS 查询,此库支持 resolv.conf 配置。然而,在具体实现中,NodeJS 层并未直接调用 resolv.conf,而是通过设置操作掩码(opmask)来决定使用的选项。在某些系统上(如苹果系统),c-ares 会使用 resolv 这个库来读取 resolv.conf 文件,获取默认域名和 DNS 服务器地址。
3. DNS 查询的 timeout:在 c-ares 实现中,timeout 的处理取决于编译时选择的分支。在第一种情况下,timeout 设置默认为 5 秒。而在使用 resolv 这个库的第二种情况下,timeout 值则会根据 resolv.conf 文件中的配置进行调整。然而,在 NodeJS 层,用户无法直接控制 timeout 的设置,因此,如果使用 lookup-dns-cache,DNS 查询的超时时间都将落回默认值,无法进行自定义设置。