Gjør ting raskere med Gearman og Supervisor

Noen ganger må tjenestene våre utføre noen store oppgaver etter brukerinteraksjon. For eksempel må vi sende et brev, generere en rapportfil eller ringe eksterne APIer. Disse oppgavene kan være sakte på grunn av tredjeparter og kan forbruke serverens ressurser.

I dette tilfellet kan en søknad bli en slange å spise en elefant, som i boken Den lille prinsen. Du tar noen data fra en bruker og får ham til å vente fordi slangen trenger litt tid til å fordøye en elefant (eller noe annet som appen din må gjøre):

For å behandle denne funksjonaliteten raskere, må du gjøre delene av søknaden din asynkron. Du kan oppnå dette ved å delegere denne oppgaven til en kraftigere server eller kjøre den i en bakgrunnsprosess.

Og Gearman er et riktig verktøy som kan brukes til å gjøre dette.

Hva skal vi gjøre?

I denne opplæringen vil vi lage et enkelt program som vil delegere en oppgave fra en klient til Gearman-arbeideren. Vår søknad vil beregne en Fibonacci-sekvens i tre prosesser. For å kjøre arbeidsprosesser, installerer og konfigurerer vi Supervisor.

Vær oppmerksom på at eksemplene i denne opplæringen trenger PHP7 til å kjøre.

Så hva er Gearman uansett?

Først, la oss oppdage hva Gearman er fra sin hjemmeside:

Gearman gir et generisk søknadsramme for å drive ut arbeid til andre maskiner eller prosesser som er bedre egnet til å utføre arbeidet. Det gjør at du kan jobbe parallelt, for å laste inn balansebehandling, og å ringe mellom språkene. Den kan brukes i en rekke applikasjoner, fra høy tilgjengelighet nettsteder til transport av database replikering hendelser. Med andre ord er det nervesystemet for hvor distribuert behandling kommuniserer.

Gearman er med andre ord et køsystem som er lett å skalere på mange servere og fleksibelt å bruke på grunn av flerspråklig støtte.

Installer Gearman

Hvis du kjører Debian / Ubuntu, kjør følgende kommando for å installere Gearman med de nødvendige verktøyene og PHP-utvidelsen:

sudo apt-get installer gearman php-gearman gearman-verktøy

Deretter kjører du Gearman-serveren og kontrollerer statusen:

sudo gearmand -d gearadmin - status

Men du vil ikke se noe nyttig etter statuskommandoen fordi vi ikke har startet noen arbeidstaker enda. Bare husk dette til vi trenger det.

Opprett en klient

Og vi er klare til å starte et script som heter client.php. Dette skriptet vil opprette en Gearman-klient og sende informasjon til en server på samme maskin:

addServer ( '127.0.0.1'); // config $ numbers = [1, 2]; // gjør en oppgave med gearmanarbeider $ res = $ klient-> doNormal ('get_sequence', json_encode ($ tall)); 

Du har kanskje lagt merke til at vi sendte tall i et JSON-format. Gearman-klienter og arbeidere snakker med hverandre i strengformat, så en av måtene å serialisere en matrise er å bruke json_encode () funksjon eller noe lignende.

Etter å ha mottatt et svar fra arbeideren, vil vi unserialize det med json_decode () og skriv ut som CSV-rader:

Vi har nettopp fullført vårt klientskript, så la oss kjøre det fra terminal:

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

Men det vil bli sittende fast uten utgang. Hvorfor? Det venter på en arbeidstaker å koble til.

Lag en arbeider

Det er på tide å skape en arbeidstaker for å gjøre jobben som ble bestilt av klienten. Vi vil kreve en fil med fibonacci () funksjon og opprett en ny Gearman-arbeider på den nåværende serveren:

addServer ( '127.0.0.1');

Etter dette vil vi legge til en ny funksjon som heter det samme som vi kalte det i klientkoden:

addFunction ('get_sequence', funksjon ($ jobb) // avkodingsinngang $ content = $ jobb-> arbeidsbelastning (); $ data = json_decode ($ innhold, sant); // beregne sekvens og returresultat $ rows = fibonacci $ data); return json_encode ($ rader););

Og selvfølgelig, ikke glem å pakke svaret ditt til JSON-format. Den siste tingen å gjøre er å løve arbeiderscriptet for å bruke det mange ganger uten å starte på nytt:

arbeid(); 

Vi kan kjøre arbeiderscriptet i bakgrunnen:

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

For øyeblikket har du kanskje allerede observert at klientskriptet har avsluttet sin jobb og skrevet noe slikt:

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

Sjekk Gearman-statusen

Endelig har vi vår arbeider som kjører, så vi kan sjekke statusen igjen:

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 

I hver rad er det et funksjonsnavn og tre tall: antall oppgaver i køen (0), antall jobber som kjører (1) og antall ledige arbeidere (2).

Selvfølgelig, for å legge til flere arbeidere, kan du kjøre flere arbeiderskript. For å stoppe hver av dem, kan du bruke Drep alle.  Men det er et godt verktøy for å styre arbeidstakere, og det kalles Supervisor.

Et par ord om veileder

Som manualen sier:

Tilsynsføreren er et klient / server system som lar brukerne overvåke og kontrollere en rekke prosesser på UNIX-lignende operativsystemer.

La oss installere den og opprette den grunnleggende konfigurasjonsfilen:

sudo apt-get installer veileder sudo nano /etc/supervisor/conf.d/supervisor.conf 

I redigeringsprogrammet som åpnes, vil vi opprette en grunnleggende konfigurasjon for en Gearman-arbeider:

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

Dette vil si til veileder at arbeideren må løpe i tre prosesser og starte på nytt når den avsluttes. Lagre konfigurasjonsfilen, oppdater Supervisor, og kontroller statusen for de kjørende prosessene:

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

Vi kan se tre arbeidstakere som er klare til å ta jobber fra klientskript.

Konklusjon

Vi har fullført de grunnleggende oppgavene for å installere og konfigurere Gearman. Nå er du fri til å spille med eksempelkode, så prøv å gjøre følgende endringer i koden:

  • Legg til litt arbeidsprosess i bakgrunnen, for eksempel å sende en e-post.
  • Spill med oppgavsprioriteter ved hjelp av GearmanClient :: doHigh.
  • Chunk data ved hjelp av GearmanJob :: sendData, som kan være nyttig i tilfelle lange oppgaver som kan observeres av statuslinjen.

Du kan også skalere kraften til dine arbeidere ved å øke antall prosesser eller kjøre dem på en raskere server. Og ikke glem å bruke veileder for å få dine arbeidere til å løpe.

Hvis du har noen spørsmål, ikke nøl med å stille spørsmål i kommentarene til artikkelen. 

Videre lesing og beslektede lenker

  • Gearman Job Server
  • Gearman Service på php.net
  • Gearman brukergrensesnitt for å overvåke Gearman-oppgaver
  • Tilsynsfører: Et prosesskontrollsystem