Zum Inhalt springen

Jobs, Worker, Clients und der Gearman (Teil 1)

Einige Webapplikationen führen Operationen durch, die einiges an Rechenzeit nutzen. Beispielsweise um Bilder skalieren oder um Dateiformate zu konvertieren. Vielfach wird hierfür ein externes Tool angebunden und dieses sychron aufgerufen, um dem Benutzer ein direktes Feedback zu geben. Leider ist die Skalierung eingeschränkt, da diese Prozesse auf dem gleichen System laufen, wie die Webapplikation.

Um dieses Problem zu beheben kann man nun Gearman nutzen. Dadurch werden die Berechnungen von der Webapplikation entkoppelt.

Gearman selbst besteht aus 3 Komponenten. Server, Client und Worker.

Der Client ist die Instanz, die eine Aufgabe an den Server heranträgt. Im obigen Beispiel ist dies die Webapplikation selbst. Der Client verbindet sich mit einem Server und ruft dort eine Methode auf und übergibt dieser die notwendigen Daten. Üblicherweise wird hierfür ein String übergeben, der bspw. ein serialisiertes Objekt ist. Spannend ist hier auch, das ein Job, der dem Server übergeben wird synchron oder aber auch asychron bearbeitet werden kann. Im sychronen Fall wird die weitere Verarbeitung angehalten, bis die Antwort zurückgeliefert wurde. Asychron wird nur eine id zurückgegeben über die man den Status des Jobs erfragen kann.

Der Server verwaltet die Jobs und verteilt diese an die Worker. Der Server verwaltet entsprechende Queues und versorgt die Worker mit Aufgaben. Aus einer Queue werden genau soviele Jobs parallel bearbeitet, wie es Worker gibt. Die Worker können sich wie auch die Clients über das Netzwerk mit dem Server verbinden, was die Anwendung sehr gut skalieren lässt.

Die Worker sind die Programmteile, die die eigentliche Arbeit ausführen. Daher auch der Name! Diese verbinden sich mit dem Server und registrieren sich auf die Methode, die ein Client aufrufen wird. Üblicherweise ist ein Worker eine Art Dämon der einen Workload bekommt (bspw das serialisierte Objekt) und diesen verarbeitet. Ist der Workload abgearbeitet, dann wird ein Rückgabe Wert über den Server an den Client übermittelt. Dies passiert auch im asynchronen Fall, jedoch muss das Ergebnis dann aktiv abgefragt werden.

Das ganze sieht als Bild (das Originalbild gibt es bspw hier) dann so aus.

Gearman ist ursprünglich in Perl geschrieben, wurde dann aber in C reimplementiert. Das Netzwerkprotokoll findet man auf der Gearman Seite und es gibt einen festen Port 4730 für die Netzwerkkommunikation.

Installation:
Wie immer benutze ich mein Basis Debian System, um die Installation zu beschreiben. Basis Debian bedeutet bei mir, die Grundinstallation, php5-cli und php-pear. Diesesmal nutze ich Wheezy, aber mit Lenny funktioniert die Geschichte auch.

Zuerst installiert man sich den Job Server.

# apt-get install gearman-job-server

Die notwendigen Dienste werden automatisch gestartet.

Um von PHP aus den Gearman Dienst nutzen zu können benötigt man nur ein PECL Modul. Dieses lässt sich aber nur installieren wenn ein paar Pakete vorhanden sind.

# apt-get install php5-dev libgearman-dev make

Make wurde bei mir komischerweise als Abhängigkeit nicht mitinstalliert, weswegen ich es extra angebe.

Nun kann man die Erweiterung für PHP schnell installieren:

# pecl install gearman-0.7.0

Am besten sucht man im pecl aber vorher nach der aktuellen Version. Heute ist es noch die Version 0.7.0.

Nach der Installation muss die php.ini noch angepasst werden.

# echo "extension=gearman.so" >> /etc/php5/cli/php.ini

Damit wird an die php.ini die neue Extension angehangen.

Ob Gearman erfolgreich installiert wurde, kann man mit folgender Zeile überprüfen. Für diejenigen die nicht so oft auf der Kommandozeile unterwegs sind ist es sicher interessant, dass php -i das Kommandozeilen-Pendant zu phpinfo() ist:

# php -i | grep gearman

Als Ausgabe sollte so etwas wie der folgende Text erscheinen:

gearman
gearman support => enabled
libgearman version => 0.14 

Nächste Woche gibt es Beispielcodes, damit wir sehen, wie man den Gearman dann auch benutzt. Wer über Ostern nicht nur Ostereier suchen will, kann aber schon mal auf php.net nach den Gearman-Objekten und deren Methoden Ausschau halten. Die Doku findet man hier. Durch eine API-Änderung sind einige Methoden deprecated, also Vorsicht beim Experiementieren.

Published inAllgemein

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close