Efectuarea de lucruri mai repede cu Gearman și supraveghetor

Uneori, serviciile noastre trebuie să îndeplinească anumite sarcini uriașe după interacțiunea cu utilizatorul. De exemplu, trebuie să trimitem o scrisoare, să generăm un fișier raport sau să sunăm API-uri externe. Aceste tipuri de sarcini pot fi lent din cauza unor terțe părți și pot consuma resursele serverului.

În acest caz, o cerere poate deveni un șarpe care mănâncă un elefant, ca în carte Micul Print. Luați niște date de la un utilizator și îl faceți să aștepte, deoarece șarpele are nevoie de ceva timp pentru a digera un elefant (sau altceva ce trebuie să facă aplicația dvs.):

Pentru a procesa mai rapid această funcționalitate, trebuie să faceți părțile din aplicația dvs. asincron. Puteți realiza acest lucru delegând această sarcină unui server mai puternic sau executându-l într-un proces de fundal.

Și Gearman este un instrument adecvat care poate fi folosit pentru a face acest lucru.

Ce vom face?

În acest tutorial, vom crea o aplicație simplă care va delega o sarcină de la un client la lucrătorul Gearman. Aplicația noastră va calcula o secvență Fibonacci în trei procese. Pentru a rula procesele de lucru, vom instala și configura Supervizor.

Rețineți că exemplele din acest tutorial necesită rularea PHP7.

Deci, ce este Gearman oricum?

În primul rând, să descoperim ce este Gearman de pe pagina sa de pornire:

Gearman oferă un cadru de aplicații generic pentru a lucra la alte mașini sau procese care sunt mai potrivite pentru a face munca. Acesta vă permite să faceți muncă în paralel, să încărcați procesarea balanței și să apelați funcții între limbi. Acesta poate fi utilizat într-o varietate de aplicații, de la site-uri de înaltă disponibilitate la transportul evenimentelor de replicare a bazei de date. Cu alte cuvinte, sistemul nervos este modul în care comunica procesarea distribuită.

Cu alte cuvinte, Gearman este un sistem de așteptare care este ușor de scalat pe multe servere și este flexibil de folosit din cauza suportului multilingv.

Instalați Gearman

Dacă executați Debian / Ubuntu, executați următoarea comandă pentru a instala Gearman cu instrumentele necesare și extensia PHP:

sudo apt-get instalează unelte pentru unelte pentru sculele de viteză php-gearman

După aceea, rulați serverul Gearman și verificați starea:

sudo gearmand -d gearadmin --status

Dar nu veți vedea nimic util după comanda de stare, deoarece nu am început încă niciun muncitor. Ține minte asta până nu avem nevoie de ea.

Creați un client

Și suntem gata să începem un script numit client.php. Acest script va crea un client Gearman și va trimite informații către un server de pe aceeași mașină:

addServer ( '127.0.0.1'); / / config $ numbers = [1, 2]; // face o sarcină cu lucrătorul pentru unelte $ res = $ client-> doNormal ('get_sequence', json_encode ($ numere)); 

S-ar putea să fi observat că am trimis numere într-un format JSON. Gearman clienții și lucrătorii vorbesc unul cu celălalt într-un format de șir, astfel încât una dintre modalitățile de a serializa o matrice este de a folosi json_encode () funcție sau ceva similar.

După primirea unui răspuns de la lucrător, îl vom neserializa json_decode () și ieșire ca rânduri CSV:

Tocmai am terminat scriptul clientului, deci hai să îl executăm de la terminal:

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

Dar va fi blocat fără nici o ieșire. De ce? Se așteaptă ca un lucrător să se conecteze.

Creați un muncitor

Este timpul să creați un lucrător care să facă lucrarea comandată de client. Vom cere un fișier cu Fibonacci () și creați un nou lucrător Gearman pe serverul curent:

addServer ( '127.0.0.1');

După aceasta, vom adăuga o nouă funcție numită așa cum am numit-o în codul clientului:

addFunction ('get_sequence', funcția ($ job) // input decode $ content = $ job-> workload (); $ data = json_decode ($ content, true); // calcula secvența și rezultatul returnat $ rows = fibonacci $ date); returnează json_encode ($ rows););

Și, bineînțeles, nu uitați să încheiați răspunsul în format JSON. Ultimul lucru pe care trebuie să-l faceți este să rulați scriptul lucrătorului să îl folosească de mai multe ori fără a reporni:

muncă(); 

Putem rula scriptul lucrătorului în fundal:

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

În acest moment, este posibil să fi observat deja că script-ul clientului și-a încheiat activitatea și a scris ceva de genul:

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

Verificați starea Gearman

În cele din urmă, avem lucrătorul nostru de funcționare, astfel încât să putem verifica din nou statutul:

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

În fiecare rând, există un nume de funcție și trei numere: numărul de sarcini din coadă (0), numărul de lucrări care rulează (1) și numărul de lucrători capabili (2).

Desigur, pentru a adăuga mai mulți lucrători, puteți rula mai multe scripturi de lucrători. Pentru a opri fiecare dintre ele, puteți folosi omoara-i pe toti.  Dar există un instrument excelent pentru gestionarea lucrătorilor și se numește Supervizor.

Câteva cuvinte despre supraveghetor

După cum spune manualul:

Supervisor este un sistem client / server care permite utilizatorilor să monitorizeze și să controleze un număr de procese pe sistemele de operare asemănătoare UNIX.

Să îl instalăm și să creăm fișierul de configurare de bază:

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

În editorul care se deschide, vom crea o configurație de bază pentru un lucrător Gearman:

[program: gearman-worker] comandă = php /vagrant/tuts-gearman-supervisor/code/worker.php autostart = adevărat autorestart = true numprocs = 3 process_name = unelte-lucrător -% (process_num) s 

Acest lucru va spune supervizorului că lucrătorul trebuie să ruleze în trei procese și să se repornească când sa încheiat. Salvați acum fișierul de configurare, reîncărcați supraveghetorul și verificați starea proceselor care rulează:

vagrant @ localserver: ~ $ sudo supervisorctl reload Restarted supervisord vagrant @ localserver: ~ $ sudo supervisorctl status unelte-lucrător: gearman-worker-0 RUNNING pid 4596, uptime 0:01:03 gearman-worker: gearman-worker-1 4595, uptime 0:01:03 unelte-lucrător: gearman-worker-2 RUNNING pid 4597, uptime 0:01:03 

Putem vedea trei muncitori care sunt gata să-și ia locul de muncă din scenariile clientului.

Concluzie

Am finalizat sarcinile de bază pentru a instala și configura Gearman. Acum sunteți liberi să jucați cu cod exemplu, așa că încercați să faceți următoarele modificări la cod:

  • Adăugați un proces de lucru în fundal, cum ar fi trimiterea unui e-mail.
  • Redați cu prioritățile sarcinii folosind GearmanClient :: doHigh.
  • Datele cu bucăți folosind GearmanJob :: sendData, care pot fi utile în cazul unor sarcini lungi care pot fi observate de bara de stare.

De asemenea, puteți scala puterea lucrătorilor dvs. prin creșterea numărului de procese sau prin difuzarea acestora pe un server mai rapid. Și nu uitați să utilizați Supervisor pentru a vă face lucrătorii să ruleze.

Dacă aveți întrebări, nu ezitați să adresați întrebări în comentariile articolului. 

Citirea ulterioară și legăturile apropiate

  • Gearman Job Server
  • Gearman Service pe php.net
  • GUI UI pentru monitorizarea sarcinilor Gearman
  • Supervizor: Un sistem de control al proceselor
Cod