我需要将大量(数十万个)域解析为Java中的IP地址。虽然使用InetAddress.getByName()
对于小数字是可行的,但大量使用它的速度远远不够(可能是因为它只向DNS服务器发送一个请求并等待响应,然后才转到下一个请求)。批量解析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/
你最好不要发送他们到我的DNS服务器...... – Alnitak
我们有我们自己的:-) – Exupery
递归服务器?他们将在哪里发送_their_查询? – Alnitak