De dingen sneller doen met Gearman en supervisor

Soms moeten onze services enkele grote taken uitvoeren na gebruikersinteractie. We moeten bijvoorbeeld een brief verzenden, een rapportbestand genereren of externe API's bellen. Dit soort taken kan traag zijn door derden en kan de bronnen van uw server verbruiken.

In dit geval kan een toepassing een slang worden die een olifant eet, zoals in het boek De kleine Prins. Je neemt wat gegevens van een gebruiker en laat hem wachten omdat de slang wat tijd nodig heeft om een ​​olifant te verteren (of iets anders dat je app moet doen):

Als u deze functionaliteit sneller wilt verwerken, moet u de onderdelen van uw toepassing maken asynchrone. U kunt dit bereiken door deze taak te delegeren naar een krachtigere server of deze uit te voeren in een achtergrondproces.

En Gearman is een goede tool die kan worden gebruikt om dit te doen.

Wat gaan we doen?

In deze zelfstudie maken we een eenvoudige toepassing die een taak van een client naar de Gearman-medewerker delegeert. Onze applicatie berekent een Fibonacci-sequentie in drie processen. Om werkprocessen uit te voeren, zullen we Supervisor installeren en configureren.

Houd er rekening mee dat de voorbeelden in deze zelfstudie PHP7 nodig hebben om te worden uitgevoerd.

Dus wat is Gearman eigenlijk?

Laten we eerst eens kijken wat Gearman is vanaf de startpagina:

Gearman biedt een generiek toepassingsraamwerk om werk uit te besteden aan andere machines of processen die beter geschikt zijn om het werk te doen. Hiermee kunt u parallel werken, balansverwerking verwerken en functies tussen talen oproepen. Het kan worden gebruikt in verschillende toepassingen, van websites met een hoge beschikbaarheid tot het transport van databasereplicatiegebeurtenissen. Met andere woorden, het is het zenuwstelsel voor de manier waarop gedistribueerde verwerking communiceert.

Met andere woorden, Gearman is een wachtrijsysteem dat eenvoudig op meerdere servers kan worden geschaald en dat flexibel kan worden gebruikt vanwege meertalige ondersteuning.

Gearman installeren

Als u Debian / Ubuntu uitvoert, voert u de volgende opdracht uit om Gearman met de benodigde hulpmiddelen en PHP-extensie te installeren:

sudo apt-get install gearman php-gearman gearman-tools

Voer daarna de Gearman-server uit en controleer de status:

sudo gearmand -d gearadmin --status

Maar u zult niets nuttigs zien na het statuscommando, omdat we nog geen enkele werknemer hebben gestart. Onthoud dit gewoon totdat we het nodig hebben.

Maak een klant aan

En we zijn klaar om een ​​script te starten dat wordt genoemd client.php. Met dit script wordt een Gearman-client gemaakt en informatie naar een server op dezelfde computer verzonden:

addserver (127.0.0.1); // config $ numbers = [1, 2]; // doe een taak met gearman worker $ res = $ client-> doNormal ('get_sequence', json_encode ($ numbers)); 

U hebt misschien gemerkt dat we nummers in JSON-formaat hebben verzonden. Gearman-clients en -werkers praten met elkaar in een tekenreeksopmaak, dus een van de manieren om een ​​array te serialiseren, is door de. Te gebruiken json_encode () functie of iets dergelijks.

Nadat we een antwoord van de werknemer hebben ontvangen, zullen we het unsenialiseren met json_decode () en uitvoer als CSV-rijen:

We zijn net klaar met ons clientscript, dus laten we het vanaf terminal gebruiken:

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

Maar het zal vastlopen zonder output. Waarom? Het wacht op een werknemer om verbinding te maken.

Maak een werknemer

Het is tijd om een ​​medewerker te maken om het werk te doen dat door de klant is besteld. We hebben een bestand nodig met de fibonacci () functioneer en maak een nieuwe Gearman-worker aan op de huidige server:

addserver (127.0.0.1);

Hierna zullen we een nieuwe functie toevoegen, dezelfde als die we in de clientcode noemden:

addFunction ('get_sequence', function ($ job) // decode input $ content = $ job-> workload (); $ data = json_decode ($ content, true); // bereken de volgorde en retourneer resultaat $ rows = fibonacci ( $ data); return json_encode ($ rows););

En vergeet natuurlijk niet om uw antwoord in JSON-formaat in te pakken. Het laatste wat u moet doen, is het werkscript herhalen in de werksessie om het vaak te gebruiken zonder opnieuw op te starten:

werk(); 

We kunnen het worker-script op de achtergrond uitvoeren:

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

Op dit moment hebt u mogelijk al opgemerkt dat het script van de client zijn taak heeft beëindigd en zoiets heeft geschreven als dit:

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

Controleer de Gearman-status

Ten slotte laten we onze medewerker draaien, zodat we de status opnieuw kunnen controleren:

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 elke rij is er een functienaam en drie cijfers: het aantal taken in de wachtrij (0), het aantal uitgevoerde taken (1) en het aantal bekwame werknemers (2).

Als u meer werknemers wilt toevoegen, kunt u natuurlijk meer werkstroomscripts uitvoeren. Om elk van deze te stoppen, kunt u gebruiken killall.  Maar er is een geweldige tool om werknemers te beheren, en het wordt Supervisor genoemd.

Een paar woorden over supervisor

Zoals de handleiding zegt:

Supervisor is een client / server-systeem waarmee gebruikers een aantal processen op UNIX-achtige besturingssystemen kunnen controleren en besturen.

Laten we het installeren en het basisconfiguratiebestand maken:

sudo apt-get install supervisor sudo nano /etc/supervisor/conf.d/supervisor.conf 

In de editor die wordt geopend, maken we een basisconfiguratie voor een Gearman-medewerker:

[programma: gearman-worker] command = php /vagrant/tuts-gearman-supervisor/code/worker.php autostart = true autorestart = true numprocs = 3 process_name = gearman-worker -% (process_num) s 

Dit zegt Supervisor dat de werker in drie processen moet uitvoeren en opnieuw moet beginnen wanneer hij is beëindigd. Sla nu het configuratiebestand op, herlaad Supervisor en controleer de status van de lopende processen:

vagrant @ localserver: ~ $ sudo supervisorctl reload Opnieuw gestarte supervisord vagrant @ localserver: ~ $ sudo supervisorctl status gearman-worker: gearman-worker-0 RUNNING pid 4596, uptime 0:01:03 gearman-worker: gearman-worker-1 RUNNING pid 4595, uptime 0:01:03 gearman-worker: gearman-worker-2 RUNNING pid 4597, uptime 0:01:03 

We kunnen drie medewerkers zien die klaar zijn om taken uit client-scripts te halen.

Conclusie

We hebben de basistaken voor het installeren en configureren van Gearman voltooid. U bent nu vrij om met voorbeeldcode te spelen, dus probeer de volgende wijzigingen in de code aan te brengen:

  • Voeg een of ander werkproces op de achtergrond toe, zoals het verzenden van een e-mail.
  • Speel met taakprioriteiten met GearmanClient :: doHigh.
  • Chunk-gegevens met GearmanJob :: sendData, wat handig kan zijn in het geval van lange taken die kunnen worden waargenomen door de statusbalk.

U kunt ook de kracht van uw werknemers schalen door het aantal processen te vergroten of ze op een snellere server uit te voeren. En vergeet niet Supervisor te gebruiken om uw werknemers te laten rennen.

Als u vragen heeft, aarzel dan niet om vragen te stellen in de opmerkingen bij het artikel. 

Verder lezen en gerelateerde links

  • Gearman Job Server
  • Gearman Service op php.net
  • Gearman UI om Gearman-taken te controleren
  • Promotor: Een procesbeheersysteem