Неблокирующее (асинхронное) разрешение DNS в Java
Существует ли чистый способ разрешения DNS-запроса (получение IP-адреса по имени хоста) в Java асинхронно, неблокирующим образом (т. Е. Конечный автомат, а не 1 запрос = 1 поток - я бы хотел выполнить десятки тысяч запросов одновременно, но не запускаются десятки тысяч потоков)?
Что я нашел до сих пор:
StandardInetAddress.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 (usingepoll
/ 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;)