Java で多数 (数十万) のドメインを IP アドレスに解決する必要があります。少数の場合は使用InetAddress.getByName()
可能ですが、大量に使用するには遅くはありません (おそらく、一度に 1 つの要求を 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 で、1 分あたり約 700 の結果がピークに達しました。これは、以前よりは改善されましたが (<300)、何十万もの解決が必要な場合にはまだそれほど優れていませんでした。スレッドごとにわずか 5 に下げると、これが 1 分あたり数千まで大幅に高速化されます。ただし、これは明らかに非常識な量のスレッドを作成するため、現在、Cで解決してhttp://www.chiark.greenend.org.uk/~ian/adns/を利用することを調査しています