解决 DNS 服务器不稳定引起的服务超时问题

微服务架构下,服务间常常会互相调用,调用前要先解析域名,如果 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