首页 > 代码库 > 异步DNS解析的实现

异步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. 多线程的调度会增加系统的开销