微服务架构下,服务间常常会互相调用,调用前要先解析域名,如果 DNS 服务器不稳定则会导致服务响应超时。
DNS 服务器一般由运维人员或者数据中心指定,属于不可控的因素,可以在程序内做 DNS 缓存缓解问题。
通过 dnscache 模块可以为 node.js 应用全局启用 DNS 缓存。
安装
npm install dnscache
启用 DNS 缓存
var dnscache = require('dnscache')({ "enable" : true, "ttl" : 300, "cachesize" : 1000 });
启用 DNS 缓存后,只会在缓存过期后才会重新解析域名,如果重新解析域名时 DNS 服务器不稳定还是会导致服务响应超时,相比不用 dnscache 这种问题出现的机率减少了。
想到一个对 dnscache 的改进:引入一个刷新时间 refresh_time (远小于缓存时间 ttl),每隔一段时间(refresh_time)异步重新解析一次缓存的域名,如果解析成功则更新 dnscache 并延长 ttl,这样只有当一段时间内(约为 ttl) DNS 服务器始终不稳定才会对服务造成影响,这个特性已在我的分支上实现 feature-keepalive 。