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客户端不仅实现了负载的均衡而且还减少了请求的次数。
2. 在定制的客户端中可采用异步解析的方法来提高解析效率。
参考:
http://blog.csdn.net/shijun_zhang/article/details/6577426
高性能爬虫为什么使用定制DNS客户端?,布布扣,bubuko.com
原文:http://www.cnblogs.com/cruze/p/3700129.html