AsyncHttpClient Нина строит Futures слишком медленно (в этом случае)
В моем коде есть цикл, который строит фьючерсы, что очень медленно. Требуется приблизительно сотни миллисекунд, чтобы построить только 1 Будущее. Я просто говорю о настройке объекта Future, а не о получении ответа. Вот код:
while(settings.getCrawlerQueue().size() < settings.getCrawlerQueueSize()) {
Task task = taskQueue.poll();
task = setFutureInTask(assignment, task);
}
И setFutureInTask()
код:
public Task setFutureInTask(String assignment, Task task) {
task.setParserAssignment(assignment);
switch(assignment){
case "stuff":
task.setFuture(asyncClientStandard
.prepareGet("http://"+task.getDomain())
.execute()
);
break;
[...]
Я пробовал разные Java JDK и версии, как предлагают в некоторых материалах, которые я прочитал (не могу найти это:/), но это не помогает. Также попробовал JDKAsyncHttpProvider
вместо по умолчанию NettyAsyncHttpProvider
, что намного быстрее, но также предоставляет очень много Flase-Negatives (кажется, отменяет очень (!) часто действительные домены). Я заметил следующее: я живу в Германии, и немецкие домены.de заметны быстрее, чем домены из других стран, таких как Испания.
Любое дикое предположение высоко ценится!:)
[EDIT]
Простое переключение на другой DNS-сервер решило проблему.
1 ответ
У меня возникла похожая (если не идентичная) проблема при написании и экспериментировании с моим подключаемым модулем тестирования нагрузки HTTP. Разрешение имен происходит синхронно при создании будущего, и если ваше кэширование DNS не работает должным образом, вы каждый раз платите за весь обход DNS.
Что касается того, как решить эту проблему, очень сложно сказать. Я обычно просто переключаюсь на другой сетевой интерфейс, который бы не показывал эту проблему.