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.
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.
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.
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.
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.phpMen 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, 21Sjekk 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.phpI 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.confI 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) sDette 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:03Vi 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:
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.