2011-12-17 2 views
3

Il doit y avoir un objet frontière - contenant un ensemble d'URL visitées et en attente d'analyse. Il doit y avoir un thread responsable de l'exploration des pages Web. Il y aurait également une sorte d'objet contrôleur pour créer des threads d'exploration.Architecture la plus rapide pour le robot d'indexation multithread

Je ne sais pas quelle architecture serait la plus rapide, la plus facile à étendre. Comment diviser les responsabilités pour faire aussi peu de synchronisation que possible et aussi minimiser le nombre de vérification si l'URL actuelle a déjà été visitée.

L'objet contrôleur devrait-il être responsable de fournir de nouvelles URL aux threads de travail - ce qui signifie que les threads de travail auront besoin d'explorer toutes les URL données, puis de dormir pendant un temps indéfini. Le contrôleur interprétera ces threads afin que le thread d'analyse puisse gérer InterruptedException (Combien cela coûte cher en Java - il semble que la gestion des exceptions ne soit pas très rapide). Ou peut-être que le contrôleur ne devrait lancer que les threads et laisser les threads ramper pour aller plus loin eux-mêmes?

Répondre

3

créer une liste partagée, sûre pour les threads avec l'URL à explorer. créez un Executor avec le nombre de threads correspondant au nombre de robots que vous souhaitez exécuter simultanément. démarrez vos robots d'exploration en tant que runnables avec une référence à la liste partagée et soumettez chacun d'entre eux à l'exécuteur. chaque robot supprime l'URL suivante de la liste et fait ce que vous avez besoin de faire, en boucle jusqu'à ce que la liste soit vide.

1

Créez une ressource centrale avec une table de hachage qui peut stocker l'URL en tant que clé avec la dernière analyse. Rendre ce fil sûr. Ensuite, il suffit de générer des threads avec des liens dans une file d'attente qui peuvent être sélectionnés par les robots comme point de départ. Chaque thread continuerait alors à explorer et mettre à jour la ressource. Un thread dans la ressource efface les analyses obsolètes. La ressource en mémoire peut être sérialisée au démarrage ou elle peut être dans une base de données en fonction des besoins de votre application.

Vous pouvez rendre cette ressource accessible via des services distants pour autoriser plusieurs machines. Vous pouvez répartir la ressource elle-même sur plusieurs machines en séparant les URL. Etc ...

1

Vous devez utiliser une file d'attente de blocage contenant les URL à extraire. Dans ce cas, vous pouvez créer plusieurs consommateurs qui vont chercher des URL dans plusieurs threads. Si la file d'attente est vide, tous les fetchers seront verrouillés. Dans ce cas, vous devez exécuter tous les threads au début et ne pas les contrôler plus tard. Vous devez également gérer une liste de pages déjà téléchargées dans un stockage persistant et vérifier avant d'ajouter à la file d'attente.

2

Son été quelques années puisque cette question a été posée, mais en novembre 2015, nous utilisons actuellement frontera et scrapyd

Scrapy utilise torsadé ce qui en fait un bon robot multithread, et sur des machines multi-core que nous signifie sont seulement limités par la bande passante entrante. Frontera-distributed utilise hbase et kafka pour marquer des liens et garder toutes les données accessibles aux clients.

Questions connexes