Неблокирующее (асинхронное) разрешение DNS в Java

Существует ли чистый способ разрешения DNS-запроса (получение IP-адреса по имени хоста) в Java асинхронно, неблокирующим образом (т. Е. Конечный автомат, а не 1 запрос = 1 поток - я бы хотел выполнить десятки тысяч запросов одновременно, но не запускаются десятки тысяч потоков)?

Что я нашел до сих пор:

Standard InetAddress.getByName() implementation is blocking and looks like standard Java libraries lack any non-blocking implementations. Resolving DNS in bulk question discusses similar problem, but the only solution found is multi-threaded approach (i.e. one thread working on only 1 query in every given moment of a time), which is not really scalable. dnsjava library is also blocking only. There are ancient non-blocking extensions to dnsjava dating from 2006, thus lacking any modern Java concurrency stuff such as Future paradigm usage and, alas, very limited queue-only implementation. dnsjnio project is also an extension to dnsjava, but it also works in threaded model (i.e. 1 query = 1 thread). asyncorg seems to be the best available solution I've found so far targeting this issue, but: it's also from 2007 and looks abandoned lacks almost any documentation/javadoc uses lots of non-standard techniques such as Fun class

Какие-либо другие идеи / реализации, которые я пропустил?

Clarification, У меня довольно большое (несколько ТБ в день) количество логов. У каждой строки журнала есть имя хоста, которое может быть практически из любого места в Интернете, и мне нужен IP-адрес для этого имени хоста для моих дальнейших вычислений статистики. Порядок строк не имеет большого значения, поэтому, в принципе, моя идея состоит в том, чтобы запустить 2 потока: сначала перебрать строки:

Read a line, parse it, get the host name Send a query to DNS server to resolve a given host name, don't block for answer Store the line and DNS query socket handle in some buffer in memory Go to the next line

И вторая тема, которая будет:

Wait for DNS server to answer any query (using epoll / kqueue like technique) Read the answer, find which line it was for in a buffer Write line with resolved IP to the output Proceed to waiting for the next answer

Простая реализация модели в Perl с использованиемAnyEvent показывает, что моя идея в целом верна, и я легко могу достичь таких скоростей, как 15–20 тыс. запросов в секунду (реализация наивной блокировки получает 2-3 запроса в секунду - просто для сравнения), так что 4 порядка разность величин). Теперь мне нужно реализовать то же самое в Java - и я бы хотел пропустить развертывание своей собственной реализации DNS;)

Ответы на вопрос(6)

Ваш ответ на вопрос