我需要将大量(数十万)域解析为 Java 中的 IP 地址。虽然InetAddress.getByName()
对于少量使用是可行的,但对于大量使用来说速度很慢(可能是因为它一次只向 DNS 服务器发送一个请求并等待响应,然后再继续下一个请求)。
有没有更有效的方法(例如将它们批量发送到 DNS 服务器)可以减少解析大量域所需的时间?
应 fmucar 的要求,我添加了用于尝试更多多线程方法的代码:
Set<String> ips = Collections.synchronizedSet(new HashSet<String>());
int i = 0;
List<Set<String>> sets = new ArrayList<Set<String>>();
for (String host : domains) {
if (i++ % 5 == 0) {
sets.add(new HashSet<String>());
}
Set<String> ipset = sets.get(sets.size()-1);
ipset.add(host);
}
for (Set<String> ipset : sets) {
Thread t = new Thread(new DomainResolver(ips, ipset));
t.start();
}
在每个线程 250 个时,我们达到了每分钟 700 个结果的峰值。虽然比以前更好(<300),但在需要解决数十万问题时仍然不是那么好。将其降低到每个线程只有 5 个,这大大加快了每分钟数千个的速度。不过,这显然会产生大量线程,因此目前正在研究在 C 中进行解析以利用http://www.chiark.greenend.org.uk/~ian/adns/