@XaveScor

Как обойти DNS-Timeout при огромном количество DNS запросов?

Я параллельно вызываю следующих код:
InetAddress address = Address.getByName(domain);
String ip = address.getHostAddress();

Но после 500-600 запросов возникает DNS Timeout. Как его обойти?
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
@nirvimel
Нельзя доводить до бесконечности количество параллельных задач. Это касается не только вычислительных задач (что очевидно), но и ввода-вывода (не столь очевидно, тем не менее - факт). Надо как-то ограничить параллельность. Вариантов решения масса. Один из лучших вариантов для равномерного распределения нагрузки, например:
  1. Создается массив потоков фиксированного размера (не ThreadPoolExecutor).
  2. Все задания помещаются во входную ConcurrentLinkedQueue (или BlockingQueue, если задания поступают постепенно и очередное приходится ждать).
  3. Каждый поток достает очередное задание из очереди (завершается в случае если очередь пустая (для случая ConcurrentLinkedQueue)), выполняет задание, помещает результат в выходную BlockingQueue.
  4. Вызывающий поток в цикле делает take() из выходной очереди столько раз, сколько задач положил во входную, после окончания цикла - обработка окончена.
Количество параллельных потоков подбирается эмпирически (в зависимости от ширины канала, в случае сетевого ввода/вывода).
Преимущества данного подхода: в каждый момент времени (за исключением периода завершения, когда входная очередь уже пуста) выполняется ровно N задач, не зависимо от продолжительности выполнения каждой отдельной задачи (продолжительность долгих и коротких задач может отличатся в десятки/сотни раз).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы