2011-12-17 3 views
3

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

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

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

ответ

3

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

1

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

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

1

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

1

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

2

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

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

Смежные вопросы