DNS 解析是高性能网络爬虫的瓶颈,主要是由于:缓存
1. 因为域名服务的分布式的特性,DNS解析可能须要屡次的请求转发,有时须要几秒甚至更长的时间来解析出相应的IP 地址。服务器
2. 现有的标准库对DNS解析的实现是同步的。网络
JAVA中InetAddress.getByName是线程阻塞的。而且JAVA中实现的DNS缓存在没有设置security manager的状况下TTL的时间仅有30s。多线程
Unix/LINUX中gethostbyname函数问题更大,在多线程的状况下,只要有一个线程的gethostbyname函数阻塞,其余的线程都会在该函数阻塞,严重的影响系统性能。异步
使用定制的DNS客户端能够缓解甚至消除DNS解析带来的瓶颈问题:分布式
1. 在定制的客户端中实现DNS Resolver,支持递归查询,并缓存DNS响应。在进行DNS解析时可先到缓存中进行查询,若是命中则直接返回IP地址,若是查询到NS记录,则直接发送消息给受权域名服务器进行查询,减小DNS请求次数。函数
如上图所示,传统的DNS客户端把全部的DNS请求都发到配置的DNS服务器,而定制的DNS客户端则直接到closer DNS server进行解析。相比之下,定制的性能
DNS客户端不只实现了负载的均衡并且还减小了请求的次数。spa
2. 在定制的客户端中可采用异步解析的方法来提升解析效率。.net
参考: