Mit Gearman und Supervisor schneller arbeiten

Manchmal müssen unsere Dienste nach der Benutzerinteraktion einige große Aufgaben erfüllen. Beispielsweise müssen wir einen Brief senden, eine Berichtsdatei generieren oder externe APIs aufrufen. Diese Aufgaben können aufgrund von Dritten langsam sein und die Ressourcen Ihres Servers belegen.

In diesem Fall kann aus einer Anwendung eine Schlange werden, die wie im Buch einen Elefanten frisst Der kleine Prinz. Sie nehmen einige Daten von einem Benutzer und lassen ihn warten, da die Schlange etwas Zeit benötigt, um einen Elefanten zu verdauen (oder etwas anderes, das Ihre App tun muss):

Um diese Funktionalität schneller zu verarbeiten, müssen Sie die Teile Ihrer Anwendung erstellen asynchron. Sie können dies erreichen, indem Sie diese Aufgabe an einen leistungsfähigeren Server delegieren oder im Hintergrund ausführen.

Gearman ist ein geeignetes Werkzeug, um dies zu erreichen.

Was werden wir machen?

In diesem Lernprogramm erstellen wir eine einfache Anwendung, mit der eine Aufgabe von einem Client an den Gearman-Mitarbeiter delegiert wird. Unsere Anwendung berechnet eine Fibonacci-Sequenz in drei Prozessen. Um Worker-Prozesse auszuführen, installieren und konfigurieren Sie Supervisor.

Bitte beachten Sie, dass die Beispiele in diesem Tutorial PHP7 zum Ausführen benötigen.

Was ist Gearman sowieso??

Lassen Sie uns zunächst von der Homepage von Gearman erfahren:

Gearman bietet ein generisches Anwendungs-Framework, um die Arbeit auf andere Maschinen oder Prozesse zu verteilen, die für die Arbeit besser geeignet sind. Sie können damit parallel arbeiten, die Balance-Verarbeitung laden und Funktionen zwischen den Sprachen aufrufen. Es kann in einer Vielzahl von Anwendungen verwendet werden, von Websites mit hoher Verfügbarkeit bis zum Transport von Datenbankreplikationsereignissen. Mit anderen Worten, es ist das Nervensystem für die Kommunikation der verteilten Verarbeitung.

Mit anderen Worten: Gearman ist ein Warteschlangensystem, das auf vielen Servern leicht skalierbar und aufgrund der Unterstützung mehrerer Sprachen flexibel einsetzbar ist.

Gearman installieren

Wenn Sie Debian / Ubuntu ausführen, führen Sie den folgenden Befehl aus, um Gearman mit den erforderlichen Tools und der PHP-Erweiterung zu installieren:

sudo apt-get install Gearman PHP-Gearman-Tools

Führen Sie danach den Gearman-Server aus und überprüfen Sie den Status:

sudo gearmand -d gearadmin --status

Nach dem Statusbefehl werden Sie jedoch nichts hilfreiches sehen, da wir noch keinen Arbeiter gestartet haben. Erinnere dich einfach daran, bis wir es brauchen.

Erstellen Sie einen Client

Und wir sind bereit, ein Skript namens "Start" zu starten client.php. Dieses Skript erstellt einen Gearman-Client und sendet Informationen an einen Server auf demselben Computer:

addServer ('127.0.0.1'); // config $ numbers = [1, 2]; // mache eine Aufgabe mit gearman worker $ res = $ client-> doNormal ('get_sequence', json_encode ($ numbers)); 

Möglicherweise haben Sie festgestellt, dass wir Zahlen in einem JSON-Format gesendet haben. Gearman-Kunden und -Mitarbeiter sprechen sich in einem String-Format miteinander. Eine der Möglichkeiten, ein Array zu serialisieren, besteht darin, das Array zu verwenden json_encode () Funktion oder ähnliches.

Nachdem wir eine Antwort vom Mitarbeiter erhalten haben, werden wir sie mit demialisieren json_decode () und als CSV-Zeilen ausgeben:

Wir haben gerade unser Client-Skript fertiggestellt, also starten wir es vom Terminal aus:

php / vagrant/tuts-gearman-supervisor/code/client.php 

Aber es wird ohne Ausgabe stecken bleiben. Warum? Es wartet darauf, dass sich ein Arbeiter verbindet.

Einen Arbeiter erstellen

Es ist an der Zeit, einen Mitarbeiter für die vom Kunden bestellte Arbeit zu erstellen. Wir benötigen eine Datei mit der Fibonacci () Funktion und erstellen Sie einen neuen Gearman-Worker auf dem aktuellen Server:

addServer ('127.0.0.1');

Danach fügen wir eine neue Funktion hinzu, die wie im Client-Code aufgerufen wird:

addFunction ('get_sequence', function ($ job) // dekodiere die Eingabe $ content = $ job-> workload (); $ data = json_decode ($ content, true); // berechne die Reihenfolge und erhalte das Ergebnis $ rows = fibonacci ( $ data); return json_encode ($ rows););

Vergessen Sie natürlich nicht, Ihre Antwort in das JSON-Format zu packen. Das letzte, was Sie tun müssen, ist eine Schleife des Arbeiterskripts, um es viele Male zu verwenden, ohne es erneut zu starten:

Arbeit(); 

Wir können das Worker-Skript im Hintergrund ausführen:

php /vagrant/tuts-gearman-supervisor/code/worker.php &

In diesem Moment haben Sie möglicherweise bereits festgestellt, dass das Client-Skript seinen Job beendet hat und Folgendes geschrieben hat:

vagrant @ localserver: ~ $ /vagrant/tuts-gearman-supervisor/code/client.php 1, 2, 3 2, 3, 5 3, 5, 8 5, 8, 13 8, 13, 21

Überprüfen Sie den Gearman-Status

Schließlich haben wir unsere Mitarbeiter am Laufen, damit wir den Status erneut überprüfen können:

vagrant @ localserver: ~ $ gearadmin --status get_sequence 0 1 2 vagrant @ localserver: ~ $ ps -aux | grep worker.php root 4595 0.0 1.5 98928 7764? S 21:52 0:00 php /vagrant/tuts-gearman-supervisor/code/worker.php root 4596 0.0 1.5 98928 7764? S 21:52 0:00 php /vagrant/tuts-gearman-supervisor/code/worker.php 

In jeder Zeile gibt es einen Funktionsnamen und drei Nummern: die Anzahl der Aufgaben in der Warteschlange (0), die Anzahl der laufenden Jobs (1) und die Anzahl der fähigen Arbeiter (2)..

Um mehr Worker hinzuzufügen, können Sie natürlich mehr Worker-Skripts ausführen. Um jeden von ihnen zu stoppen, können Sie verwenden alle töten.  Es gibt jedoch ein hervorragendes Werkzeug zum Verwalten von Arbeitern, das Supervisor genannt wird.

Ein paar Worte zu Supervisor

Wie das Handbuch sagt:

Supervisor ist ein Client / Server-System, mit dem Benutzer eine Reihe von Prozessen unter UNIX-ähnlichen Betriebssystemen überwachen und steuern können.

Lassen Sie uns es installieren und die grundlegende Konfigurationsdatei erstellen:

sudo apt-get Supervisor installieren sudo nano /etc/supervisor/conf.d/supervisor.conf 

In dem sich öffnenden Editor erstellen wir eine grundlegende Konfiguration für einen Gearman-Mitarbeiter:

[program: gearman-worker] command = php /vagrant/tuts-gearman-supervisor/code/worker.php autostart = true autorestart = true numprocs = 3 Prozessname = Gearman-Arbeiter -% (Prozessnummer) s 

Dies sagt Supervisor, dass der Worker in drei Prozessen laufen muss und nach Beendigung neu gestartet werden muss. Speichern Sie nun die Konfigurationsdatei, laden Sie Supervisor erneut und überprüfen Sie den Status der laufenden Prozesse:

vagrant @ localserver: ~ $ sudo supervisorctl reload Wiederbegonnenes Supervisord vagrant @ localserver: ~ $ sudo supervisorctl Status Gearman-Worker: Gearman-Worker-0 RUNNING pid 4596, Betriebszeit 0:01:03 Gearman-Worker: Gearman-Worker: 1 4595, Betriebszeit 0:01:03 Gearman-Arbeiter: Gearman-Arbeiter-2 LAUFEN pid 4597, Betriebszeit 0:01:03 

Wir sehen drei Mitarbeiter, die bereit sind, Jobs aus Client-Skripten zu übernehmen.

Fazit

Wir haben die grundlegenden Aufgaben zur Installation und Konfiguration von Gearman abgeschlossen. Jetzt können Sie mit Beispielcode spielen. Versuchen Sie daher, folgende Änderungen am Code vorzunehmen:

  • Fügen Sie im Hintergrund einen Arbeitsprozess hinzu, z. B. das Senden einer E-Mail.
  • Spiele mit Task-Prioritäten mit GearmanClient :: doHigh.
  • Chunk-Daten mithilfe von GearmanJob :: sendData, was bei langen Aufgaben hilfreich sein kann, die von der Statusleiste beobachtet werden können.

Außerdem können Sie die Leistung Ihrer Mitarbeiter skalieren, indem Sie die Anzahl der Prozesse erhöhen oder auf einem schnelleren Server ausführen. Vergessen Sie nicht, Supervisor zu verwenden, um Ihre Mitarbeiter zum Laufen zu bringen.

Wenn Sie Fragen haben, zögern Sie nicht, Fragen in den Kommentaren des Artikels zu stellen. 

Weiterführende Literatur und verwandte Links

  • Gearman Job Server
  • Gearman Service auf php.net
  • Gearman-Benutzeroberfläche zur Überwachung der Gearman-Aufgaben
  • Supervisor: Ein Prozesssteuerungssystem