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

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

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

  • Стандартная реализация InetAddress.getByName()является блокирующей, и похоже, что в стандартных библиотеках Java отсутствуют какие-либо неблокирующие реализации -.
  • Массовое разрешение DNS обсуждает аналогичную проблему, но единственным найденным решением является многопоточный -подход (, т. е. один поток обрабатывает только 1 запрос в каждый заданный момент времени ), что на самом деле не масштабируемый.
  • библиотека dnsjava тоже только блокирует.
  • Существуют древние неблокирующие -расширения для dnsjava , выпущенные в 2006 году, поэтому в них отсутствуют какие-либо современные параллелизм Java, такие как Futureиспользование парадигмы и, увы, очень ограниченная реализация -только очереди.
  • Проект dnsjnio также является расширением dnsjava, но он также работает в многопоточной модели (, т. е. 1 запрос = 1 поток ).
  • asyncorg кажется лучшим доступным решением этой проблемы, которое я нашел до сих пор, но:
    • он тоже 2007 года и выглядит заброшенным
    • отсутствует почти какая-либо документация/javadoc
    • использует множество нестандартных -методов, таких как класс Fun

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

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

  • Прочитать строку, разобрать ее, получить имя хоста
  • Отправить запрос на DNS-сервер для разрешения заданного имени хоста, не блокировать ответ
  • Сохраните строку и дескриптор сокета DNS-запроса в некотором буфере в памяти
  • . Перейти к следующей строке

И второй поток, который будет:

  • Подождите, пока DNS-сервер ответит на любой запрос (, используя epoll/ kqueueподобный метод )
  • . Прочитайте ответ, найдите, для какой строки он был в буфере
  • Записать строку с разрешенным IP на выход
  • Перейти к ожиданию следующего ответа

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

28
задан Community 23 May 2017 в 11:46
поделиться