2

Ich schreibe einen Web-Crawler, der in der Lage sein soll, mehrere Seiten gleichzeitig zu analysieren. Ich benutze Nokogiri zum Parsen, was sehr gut ist und alle meine Aufgaben löst, aber ich weiß nicht, wie ich eine bessere Leistung erreichen kann.Web Crawler in Ruby: Wie erreicht man die beste Performance?

Ich benutze Threads, um viele Open-Uri Anfragen gleichzeitig zu machen und es macht den Prozess schneller, aber es scheint, dass es noch weit von dem Potential entfernt ist, das ich von einem einzelnen Server erreichen kann. Sollte ich mehrere Prozesse verwenden? Was sind die Grenzen der Threads und Prozesse, die für eine einzelne Ruby-Anwendung gestartet werden können?

Mit anderen Worten: Wie erreicht man in diesem Fall die beste Leistung?

+0

Hmm, in Java neu schreiben? –

Antwort

1

Wir verwenden eine Kombination aus ActiveMQ/Active Messaging, Event Machine und Multithreading für dieses Problem. Wir beginnen mit einer großen Liste von URLs zum Abrufen. Wir teilen sie dann in Chargen von 100 URLs pro Batch auf. Jeder Stapel wird dann in ActiveMQ verschoben. Dann haben wir eine Reihe von Poller/Consumer-Prozessen, die die Warteschlange abhören. Diese Benutzer können sich alle auf einem Computer befinden oder sie können auf mehrere Computer verteilt sein. Das Array von Konsumenten kann beliebig groß werden, um so viel Parallelität zu unterstützen, wie wir wollen. Die Verbraucher verwenden Active Messaging, was eine nette Ruby-Integration mit ActiveMQ ist.

Wenn ein Verbraucher eine Nachricht zur Verarbeitung eines Stapels von 100 URLs erhält, wird Event Machine gestartet, um einen Threadpool zu erstellen, der mehrere Nachrichten in mehreren Threads verarbeiten kann. Wie Sie verwenden wir Nokogiri, um jede URL zu verarbeiten.

So gibt es drei Stufen von Parallelität:

1) Mehrere gleichzeitige Anfragen pro Verbraucher Prozess, unterstützt von Event-Maschine und Threads.

2) Mehrere Verbraucherprozesse pro Computer.

3) Mehrere Computer.

+0

vielen Dank, ich werde wahrscheinlich diese Architektur versuchen. Ist Event Machine ein Teil des Konsumentenprozesses? Oder ist es ein separater Prozess? Welche Leistung haben Sie erreicht? – Arty

4

Ich mag Typhoeus and Hydra für die Behandlung mehrerer Anfragen auf einmal.

Typhoeus ist die HTTP-Clientseite, und Hydra ist der Teil, der mehrere Anforderungen verarbeitet. Die Beispiele sind gut, also gehen Sie durch sie und sehen Sie.

3

Während es sich anhört, als ob Sie nicht nach etwas suchen, das so komplex ist, fand ich diese These vor einiger Zeit interessant: Building blocks of a scalable webcrawler - Marc Seeger.

In Bezug auf Threading/Prozessgrenzen hat Ruby ein sehr geringes Threading-Potenzial. Standard-Ruby (MRI/YARV) und Rubinius unterstützen keine simultane Thread-Ausführung, es sei denn, es wird eine Erweiterung verwendet, die speziell dafür entwickelt wurde. Abhängig davon, wie viel von Ihrem Leistungsproblem im IO ist und wie viel in der Verarbeitung ist, könnte ich vorschlagen, EventMachine zu verwenden.

Multi-Prozess aber Ruby funktioniert sehr gut, solange Sie eine gute Manager/Datenbank für alle Prozesse haben, mit denen dann mehrere Prozesse laufen sollten skalieren sowie Ihre Prozessorleistung ermöglicht.

+0

Vielen Dank für den Link zu dieser These. Lesen Sie es jetzt, sehr interessant. – Arty

+1

Hehe, froh Leute mögen meine These :) –

1

Wenn Sie etwas einfach gehen für http://anemone.rubyforge.org/
Wenn Sie etwas schnell, Code etwas mit eventmachine/em-http-request wollen

I redis ein großes Mehrzweckwerkzeug für Queue-Management, Caching erwiesen und bald. Du könntest auch spezielle Dinge wie beanstalkd/active mq/... verwenden.aber zumindest in meinem Anwendungsfall fand ich sie im Vergleich zu redis nicht wirklich als einen großen Vorteil. Insbesondere könnte die Last auf dem Backend-System ein Engpass sein, so wählen Sie Ihre Datenbank sorgfältig und achten Sie auf, was Sie

3

Hey eine andere Art und Weise speichern ist eine Kombination aus Nokogiri und Hüttenarbeiter zu verwenden (IronMQ und IronCache).

einen vollständigen Blogeintrag Siehe zum Thema here