Ausführen mehrerer paralleler Hintergrundjobs mit Rails

8

In meiner Ruby on Rails-Anwendung muss ich 50 Hintergrundjobs parallel ausführen. Jeder Job erstellt eine TCP-Verbindung zu einem anderen Server, stellt einige Daten bereit und aktualisiert ein aktives Datensatzobjekt.

Ich kenne verschiedene Lösungen, um diese Aufgabe zu erfüllen, aber keine davon parallel. Zum Beispiel könnte "delayed_job" (DJ) eine großartige Lösung sein, wenn nur alle Jobs parallel ausgeführt werden könnten.

Irgendwelche Ideen? Danke.

    
fjyaniez 22.10.2009, 09:23
quelle

3 Antworten

1

Einige Gedanken ...

  • Nur weil Sie 50 Seiten lesen müssen und natürlich parallel arbeiten möchten, bedeutet nicht , dass Sie 50 Prozesse oder Threads benötigen. Sie müssen die Verlangsamung und den Overhead ausbalancieren. Wie wäre es mit 10 oder 20 Prozesse lesen jeweils ein paar Websites?

  • Seien Sie vorsichtig bei den grünen Threads, je nachdem, welchen Ruby Sie verwenden. Sie erhalten möglicherweise nicht das gewünschte parallele Ergebnis

  • Sie möchten es möglicherweise wie eine umgekehrte Clientseite inetd strukturieren und connect_nonblock und IO.select verwenden, um die gewünschten parallelen Verbindungen zu erhalten, indem Sie alle Server parallel antworten lassen. Sie brauchen die parallele Verarbeitung der Ergebnisse nicht wirklich, Sie müssen sich nur parallel an alle Server anschließen, denn genau hier liegt die Latenz.

So etwas aus der Socket-Bibliothek ... erweitere es für mehrere ausstehende Verbindungen ...

%Vor%     
DigitalRoss 22.10.2009, 17:00
quelle
6

Es ist tatsächlich möglich, mehrere delayed_job Worker auszuführen.

Von Ссылка :

%Vor%

In der Theorie könnten Sie einfach Folgendes ausführen:

%Vor%

Das wird 50 Prozesse hervorbringen, aber ich bin mir nicht sicher, ob das in Abhängigkeit von den Ressourcen des Systems, auf dem Sie dies ausführen, empfohlen wird.

Eine alternative Option wäre die Verwendung von Threads . Erstellen Sie einfach einen neuen Thread für jeden Ihrer Jobs.

Eine Sache, die es zu ertragen gilt, ist, dass ActiveRecord nicht Thread-sicher ist. Sie können es mit der folgenden Einstellung threadsicher machen:

%Vor%     
Olly 22.10.2009 09:49
quelle
0

Da Sie mit Schienen arbeiten, rate ich Ihnen, delayed_job dafür zu verwenden, anstatt in Fäden oder Gabeln zu springen. Der Grund dafür - sich mit Timeouts und anderem zu beschäftigen, wenn der Browser wartet, kann ein echter Schmerz sein. Es gibt zwei Ansätze, die du mit DJ

machen kannst

Die erste ist - spawn 50+ Arbeiter. Abhängig von Ihrer Umgebung kann dies eine ziemlich große Speicherlösung sein, aber es funktioniert großartig. Wenn Sie Ihren Job ausführen müssen, stellen Sie sicher, dass Sie 50 eindeutige Jobs erstellen. Wenn zu viel Speicher aufgebläht ist und Sie die Dinge auf diese Weise tun möchten, erstellen Sie eine separate Umgebung, die speziell für Ihre Mitarbeiter entfernt ist.

Die zweite Möglichkeit besteht darin, einen einzelnen Job zu erstellen, der Curl :: Multi verwendet, um Ihre 50 gleichzeitigen TCP-Anforderungen auszuführen. Mehr dazu erfahren Sie hier: Ссылка Auf diese Weise könnten Sie einen Hintergrundprozessor haben, auf dem alle Ihre TCP-Anfragen laufen parallel.

    
PatrickTulskie 27.10.2009 19:49
quelle