Mittwoch, 23. Juni 2010

Background Processing mit Ruby und Resque

Als Vorbereitung für ein kleines Projekt bei dem aufgrund einer Eingabe in einem Webfrontend ein Programm am Server gestartet werden soll hab ich nach einer Möglichkeit gesucht lang laufende Prozesse mit Ruby zu verarbeiten. Wichtig war mir ua., dass das Lib auch ohne Rails funktioniert, da ich schlussendlich Sinatra verwenden möchte.


Eine guten Überblick über die für Ruby bzw. Rails angebotenen Libs findet man hier (bzw. die Kategorie: "queueing" hier). Die auf der Seite angegebene Popularitässcala hab ich bei der Entscheidungsfindung erst mal kompett ignoriert. Nach einigem herumprobieren mit anderen Libs bin ich schießlich bei Resque - der derzeitigen Nummer 2 - gelandet, sodass ich zugeben muss, dass die Liste möglicherweise nicht ganz daneben liegt.
Reque läuft - was mir besonders wichtig war - sowohl unter Linux als auch Windows und bringt zudem ein ziemlich hübsches Sinatra-Frontend mit, über das der Status der Queues und der Worker-Prozesse abgefragt werden kann. Ideal, da ich das sowieso haben wollte.

Installation:

gem install resque

... fertig!? Reicht unter Linux aber *nicht* unter Windows! Als Speicher für die Queues wird nähmlich Redis verwendet und das für die Verwendung mit ruby angebotene gem ladet nur die Sourcen und versucht diese dann zu kompilieren. Nachdem ich unter Windows keine Entwicklungsumgebung installiert hab, funkt das nicht. Zum Glück hatten auch andere das Problem und dieses auch schon gelöst. Auf RedisWindowsDownload findet man ein zip-file das den Redis-Server als vorkompiliertes Paket enthält, sodass man sofort loslegen kann.

3-2-1 Start:
Damit die mitgelieferte Demo ausprobiert werden kann müssen mehrere Programme gestartet werden. Als erstes ist diese redis:

C:\prog\redis-1.3.7-windows>redis-server.exe

Damit startet der Server und ist über den Port 6379 erreichbar. Der Port und weitere Einstellungen werden in redis.conf getroffen. Dieses File steht im gleichen Dir wie das exe-File. Zum Ausprobieren reichen die Defaulteinstellungen. Redis an sich ist ein ausgereifter Key-Value-Store und bietet dabei nicht nur die Möglichkeit Daten zu einem Key zu speichern und wieder abzufragen, sondern hat auch komplexere Features um beispielweise Listen effizient zu verarbeiten.

Die Demo - eine Sinatra-Anwendung - wird dann wie folgt gestartet:

C:\prog\Ruby-1.8.6\lib\ruby\gems\1.8\gems\resque-1.7.1\examples\demo>rackup conf
ig.ru

Der letzte Schritt ist als Umgebungsvariable festzulegen welche QUEUE verarbeitet werden soll und dann muss noch der Worker-Job an sich gestartet werden, damit die Jobs nicht nur in der Queue stehen, sondern auch abgearbeitet werden:

C:\...\examples\demo>set QUEUE=default
C:\...\examples\demo>rake resque:work

Über das Webfrontend kann man dann sehr schön sehen, wie die Jobs verarbeitet werden.

Fazit:
Resque ist eine ausgereifte Lösung, welche sowohl unter Linux als auch unter Windows verwendet werden kann. Wenn man zudem weiß, dass Resque von Github.com entwickelt wurde und die das natürlich auch für ihre eigenen Verarbeitungen nutzen (angeblich 50%) kann man sich vorstellen, dass dies eine Lösung ist, die auch professionellen Ansprüchen gerecht wird. Jeder muß natürlich selbst prüfen, ob Resque für den angestrebten Einsatzzweck geeignet ist und damit die gestellten Anforderungen erfüllt. oder ob man eher zu einem der reichlich vorhandenen Alternativen greift.


3<
Read More !