异步DNS解析的实现
在高性能爬虫为什么使用定制DNS客户端一文中阐述了DNS解析是网络爬虫的瓶颈。
目前主要有两种方法来提高DNS解析效率:
1. 基于多线程的DNS 解析
2. 基于NIO的DNS解析
dnsjava中使用的解析方式就是基于多线程的DNS解析
class ResolveThread extends Thread { private Message query; private Object id; private ResolverListener listener; private Resolver res; /** Creates a new ResolveThread */ public ResolveThread(Resolver res, Message query, Object id, ResolverListener listener){ this.res = res; this.query = query; this.id = id; this.listener = listener; } /** * Performs the query, and executes the callback. */ public void run() { try { Message response = res.send(query); listener.receiveMessage(id, response); } catch (Exception e) { listener.handleException(id, e); } } }
ResolveThread继承了Thread类并重写了run方法,在run方法中发送一个解析请求并等待响应,当接收到响应时调用
listener.receiveMessage 回调函数来处理该响应。
基于NIO的DNS解析中可设置两个线程,一个线程用来发送dns请求另外一个用来接收dns响应。
本文推荐使用方法二,原因如下:
1. 多线程环境下要考虑同步的问题,对于资源的访问要加锁
2. 多线程环境下要建立多个socket,占用系统资源
3. 多线程的调度会增加系统的开销