Самая быстрая архитектура для многопоточного сканера - PullRequest
3 голосов
/ 17 декабря 2011

Должен быть пограничный объект - удерживающий набор посещенных и ожидающий сканирования URL-адресов. Должна быть какая-то тема, отвечающая за сканирование веб-страниц. Также будет какой-то объект контроллера для создания потоков сканирования.

Я не знаю, какая архитектура будет быстрее, проще расширять. Как разделить обязанности, чтобы сделать как можно меньше синхронизации, а также минимизировать количество проверок, если текущий URL уже посещен.

Если объект контроллера отвечает за предоставление новых URL-адресов рабочим потокам - это означает, что рабочие потоки должны будут сканировать все заданные URL-адреса и затем спать в течение неопределенного времени. Контроллер будет интерпретировать эти потоки, поэтому обходящий поток должен обрабатывать InterruptedException (насколько это дорого в Java - кажется, что обработка исключений не очень быстрая). Или, может быть, контроллер должен только запускать потоки и позволять сканирующим потокам самим выбирать границы?

Ответы [ 5 ]

3 голосов
/ 17 декабря 2011

создать общий потокобезопасный список с просматриваемыми URL-адресами. создайте Executor с числом потоков, соответствующим числу сканеров, которые вы хотите запустить одновременно. запустите ваши сканеры как Runnables со ссылкой на общий список и отправьте каждый из них исполнителю. каждый сканер удаляет следующий URL из списка и выполняет все, что вам нужно, зацикливаясь до тех пор, пока список не станет пустым.

2 голосов
/ 12 ноября 2015

Прошло несколько лет с тех пор, как этот вопрос был задан, но в ноябре 2015 года мы в настоящее время используем frontera и scrapyd

Scrapy использует витую, что делаетхороший многопоточный сканер и на многоядерных машинах, что означает, что мы ограничены только входящей пропускной способностью.Распределенный Frontera использует hbase и kafka для оценки ссылок и обеспечения доступности всех данных для клиентов.

1 голос
/ 18 декабря 2011

Если вы не хотите заново изобретать колесо, почему бы не посмотреть на Apache Nutch .

1 голос
/ 17 декабря 2011

Вы должны использовать блокирующую очередь, которая содержит URL-адреса, которые необходимо получить.В этом случае вы можете создать несколько потребителей, которые будут получать URL-адреса в нескольких потоках.Если очередь пуста, все сборщики будут заблокированы.В этом случае вы должны запустить все потоки в начале и не должны контролировать их позже.Также вам необходимо сохранить список уже загруженных страниц в некотором постоянном хранилище и проверить перед добавлением в очередь.

1 голос
/ 17 декабря 2011

Создайте центральный ресурс с хэш-картой, которая может хранить URL-адрес как ключ с момента последнего сканирования.Сделайте эту тему безопасной.Затем просто создайте темы со ссылками в очереди, которые сканеры могут использовать в качестве отправной точки.Затем каждый поток будет продолжать сканирование и обновление ресурса.Поток в ресурсе очищает устаревшие обходы.Ресурс в памяти может быть сериализован при запуске или может быть в дБ в зависимости от потребностей вашего приложения.

Вы можете сделать этот ресурс доступным через удаленные службы, чтобы разрешить использование нескольких машин.Сам ресурс можно распределить по нескольким машинам, разделив URL-адреса.Etc ...

...