我需要將大量(數十萬個)域解析爲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