Facebook
Twitter
Google+
Kommentare
3
Willkommen bei "the web hates me". Mittlerweile hat unser Team ein tolles neues Monitoringtool für Agenturen gelauncht. Unter dem Namen koality.io haben wir einen Service geschaffen, der er Agenturen ermöglicht mit sehr geringen Kosten alle Ihre Webseiten zu überwachen.

Rabbit MQ / Gearman mit PHP im Vergleich (Teil 1)

Der erste Teil befasst sich mit den Features des Gearman-Frameworks im PHP-Umfeld. Der zweite Teil zeigt die Features von Rabbit-MQ. Der dritte Teil fasst die Unterschiede zusammen und versucht herauszufinden, wann Gearman oder Rabbit-MQ eingesetzt werden kann. Im vierten Teil wird gezeigt, wie ein Video-Transkode-Service mit Gearman- und Rabbit-MQ aufgebaut werden kann.

Was ist Gearman?

Gearman ist ein Framework, das es ermöglicht Applikationen miteinander zu verbinden, in dem zum Beispiel ein PHP Client und ein Python Worker verwendet wird. Das Gearman-Framework lässt sich auch gut zur Skalierung von Teilen der Applikation die viel CPU-Leistung benötigen einsetzen. Das erhöht die Performance der Applikation.

Das Gearman-Framework stellt einen Job-Server und eine Client- und Worker-API zur Verfügung. Der Job-Server kann als C- (gearmand), Perl (Gearman::Server) oder Java-Programm (java-gearman-service) installiert werden. Die Gearman-Dokumentation beschreibt aber nur den Einsatz des in C geschriebenen gearmand, da hier die meiste Entwicklungsaktivität verzeichnet werden kann. Die Client- und Worker-API ist steht für verschiedene Sprachen zur Verfügung. Natürlich auch für PHP. Die PHP API ist in zwei verschiedenen PHP Extension verfügbar. Die eine Extension ist eine reine PHP-Extension und die andere wrapped die C-Implementierung und stellt sie für PHP zur Verfügung.

Zusätzlich existiert noch der Gearman-Manager, der beide Extension verwenden kann und PHP-Worker-Gruppen verwalten kann.

Wie nutze ich Gearman für meine Applikation?

Zuerst einmal muss der Gearman-Job-Server installiert werden. Für die meisten Linux Distributionen existiert ein fertiges Paket. Für Debian oder Ubuntu kann man einfach aptitude verwenden um den Gearman-Server zu installieren.

Anschließend wird noch die PHP-Erweiterung benötigt. Auch hierfür gibt es bei Debian oder Ubuntu ein Paket: php5-gearman. Damit wird dann die PHP-Erweiterung, die libgearman nutzt, installiert. Natürlich kann man auch direkt über PECL installieren. Dazu sind aber die Abhängigkeiten zu anderen Paketen aufzulösen. Eine genauere Beschreibung findet sich auf: http://pecl.php.net/package/gearman.

Nach der Installation dieser beiden Pakete ist PHP in der Lage die Client- und Worker-API des Gearman-Frameworks zu bedienen und den Job-Server anzusprechen.

In der Gearman-Dokumentation wird gezeigt wie ein Satz mit Hilfe des Gearman-Frameworks einen Satz umdreht. Dazu werden einfach zwei PHP-Scripte geschrieben. Ein Client-Script und ein Worker-Script. Der Client ist die Kopplung der Applikation mit dem Gearman-Framework. Er nutzt die Client-API um Jobs an den Gearman-Job-Server zu geben. Das Beispiel in der Dokumentation zum Gearman-Framework ist sehr einfach und behandelt nicht alle Möglichkeiten die das Framework bietet. Die weitreichenden Features der Client- und Worker API werden aber sehr gut auf http://php.net/manual/gearman gezeigt.

Erweiterte Einsatzmöglichkeiten für Gearman:

Mit dem Gearman-Framework können mehrere Server gleichzeitig angesprochen werden, die dann Jobs ausführen. Der Client stellt sicher, dass die Jobs richtig verteilt werden. Es können Callbacks für Status- und Fehlermeldungen, sowie Exceptions registriert werden, auf die dann im Client reagiert werden kann. Tasks können synchron, das heißt, der Client wartet auf die Ergebnisse des oder der Worker, und asynchron, das heißt, der Client wartet nicht auf Ergebnisse, ausgeführt werden. Sowohl Background als auch für Foreground-Tasks können als High- oder Low-Priority-Tasks ausgeführt werden und natürlich kann ein Timeout eingestellt, werden, damit bei einem Foreground-Task die Applikation nicht zu langen warten muss.

Wie stellt man fest, ob Gearman eingesetzt werden kann?

Natürlich reizt die Technologie. Ich würde gerne sofort in meinen Applikationen ausprobieren ob es funktioniert. Das bedeutet aber, dass eine weitere Komplexitätsebene in meine Applikationen Einzug erhält. Daher verkneife ich es mir, weil ich weiß, dass die Performance ausreichend ist und ich auch keine Stelle habe, die mit anderen Applikationen sprechen muss. Wie aber findet man heraus, wann Gearman hilft?

Wenn man von Teilen in der Applikation weiß, die viel CPU-Leistung benötigen oder die Ausführung der Applikation aufhalten oder vielleicht sogar behindern, ist dies natürlich hilfreich und man kann für die Stellen den Profiler anwerfen und schauen, ob wirklich CPU-Leistung benötigt wird. Mögliche Scenarien sind zum Beispiel: Mails versenden, Logging, Thumbnailing, Video-Transkodierung, Prozessieren von großen (teilbaren) Datenmengen, … Wenn dabei der Profiler zeigt, dass die Applikation zu viel Zeit benötigt und hier optimiert werden könnte oder eine asynchrone Ausführung möglich ist, kann Gearman eingesetzt werden.

Ein anderes Kriterium ist der Einsatz von exec-, system-, passthrough- oder ähnlichen Funktionsaufrufen um andere Programme auszuführen. An diesen Codestellen ist dann auch noch einmal zu prüfen ob der Einsatz von Gearman mit einem spezifischen Worker sinnvoll ist.

Fazit

Mit seinen Features erlaubt das Gearman-Framework eine feingranulare Abstimmung von einzelnen Tasks innerhalb der eigenen Applikation. Dabei ist zu beachten, dass das Framework immer ein Teil der Applikation ist, da im Gearman-Client bekannt sein muss welche Methoden die Worker zur Verfügung stellen.

Diese Einschränkungen kann man aber verschmerzen, wenn es dadurch gelingt Performance-Anforderungen zu erfüllen oder andere Applikationen sauber anzusprechen. Insgesamt ist Gearman ausgereift und relativ einfach zu bedienen. Man muss sich aber im Klaren darüber sein ob und wenn, wie und an welchen Stellen man das Framework einsetzt. Wenn die Performance der Applikation ausreichend ist und sie nicht mit anderen Applikationen zusammenarbeiten muss, ist Gearman eine weitere Komplexitätsebene die in die Applikation eingebaut wird. Und diese sind natürlich zu vermeiden.

Über den Autor

Mike Lohmann

Mike Lohmann arbeitet zur Zeit als Software Architekt beim Verlag Gruner+Jahr AG & Co KG. Er arbeitet seit 1998 im IT-Bereich und seit 2000 im Bereich Webentwicklung.
Kommentare

3 Comments

  1. Nach kurzem suchen musste ich leider feststellen dass es noch keine Weiteren Teile dieser Serie gibt. Wenn man auf das Datum dieses Artikels schaut ist’s für die User etwas enttäuschend und tatsächlich so verwirrend, dass ich aus lauter Idiotie kurz die gegebenen (guten!) Lesetipps auf PHP-Monkeys für die weiteren Postings gehalten habe.

    Ich würde mich freuen wenn der erste Absatz für die Nachfolgenden Leser klarer gestaltet wird oder in absehbarer Zeit ein Teil 2 erscheint. Sollte letzteres nicht der Fall sein sind Verweise auf Fremde Tutorials zum Tema Rabbit MQ vs. Gearman mit PHP sicher sinnvoll. Denn Ihr habt mich jetzt auf Rabbit MQ gebracht, dann mag ich da auch gerne die Vorarbeit der Ressourcen-Auswahl von Leuten abgenommen bekommen, die sich mit dem Thema bereits praxisnah beschäftigt haben.

    Soweit trotz allem mein Kompliment für die Mühe an Mike und beste Grüße aus Kerpen!

    Reply
  2. Hi,

    Du hast vollkommen Recht. Ich bin da noch ein paar Artikel der Serie schuldig. Sie stehen auch in meiner ToDo-Liste allerdings nicht so weit oben, wie gewünscht.

    Einige andere höher priorisierte Artikel müssen vorher noch abgegeben werden. Allerdings wird das spätestens Ende September sein. Danach ist dann die Zeit für die weiteren Teile gekommen.

    Ich bitte also noch um etwas Geduld und vielleicht Verständnis.

    Viele Grüße

    Mike

    Reply
    • Huhu Mike, nun acuh ich finde den Artikel interessant, umso verwirrender finde ich die Zeitangabe September 🙂 Nimm doch die anderen Themen raus wenn diese nicht nachgezogen werden.

      LG

      Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen