Ibland behöver våra tjänster utföra några stora uppgifter efter användarinteraktion. Vi behöver till exempel skicka ett brev, skapa en rapportfil eller ringa externa API-er. Dessa typer av uppgifter kan vara långsamma på grund av tredje part och kan konsumera resurserna på din server.
I detta fall kan en ansökan bli en orm som äter en elefant, som i boken Den lilla prinsen. Du tar några data från en användare och får honom att vänta, eftersom ormen behöver lite tid att smälta en elefant (eller något annat som din app behöver göra):
För att bearbeta den här funktionen snabbare måste du göra delarna av din ansökan asynkron. Du kan uppnå detta genom att delegera denna uppgift till en kraftfullare server eller köra den i en bakgrundsprocess.
Och Gearman är ett riktigt verktyg som kan användas för att göra detta.
I den här handledningen skapar vi en enkel applikation som delegerar en uppgift från en klient till Gearman-arbetaren. Vår ansökan kommer att beräkna en Fibonacci-sekvens i tre processer. För att köra arbetsprocesser ska vi installera och konfigurera Supervisor.
Observera att exemplen i denna handledning behöver PHP7 att köra.
Låt oss först upptäcka vad Gearman är från sin hemsida:
Gearman tillhandahåller en generisk applikationsram för att utföra arbete på andra maskiner eller processer som är bättre lämpade för att utföra arbetet. Det gör att du kan göra arbete parallellt, för att ladda balansbehandling och att ringa funktioner mellan språk. Den kan användas i en mängd olika applikationer, från webbplatser med hög tillgänglighet till transport av databasreplikationshändelser. Med andra ord är det nervsystemet för hur distribuerad behandling kommunicerar.
Gearman är med andra ord ett köningssystem som är lätt att skala på många servrar och flexibelt att använda på grund av flerspråkigt stöd.
Om du kör Debian / Ubuntu, kör följande kommando för att installera Gearman med nödvändiga verktyg och PHP-förlängning:
sudo apt-get installera gearman php-gearman gearman-tools
Därefter kör Gearman-servern och kontrollera statusen:
sudo gearmand -d gearadmin - status
Men du kommer inte se något till hjälp efter statuskommandot eftersom vi inte har startat någon arbetare än. Kom bara ihåg det här tills vi behöver det.
Och vi är redo att starta ett skript som heter client.php
. Detta skript skapar en Gearman-klient och skickar information till en server på samma maskin:
addServer ( '127.0.0.1'); // config $ numbers = [1, 2]; // göra en uppgift med gearmanarbetare $ res = $ client-> doNormal ('get_sequence', json_encode ($ numbers));
Du kanske har märkt att vi skickade nummer i ett JSON-format. Gearman-klienter och arbetare pratar med varandra i ett strängformat, så ett av sätten att serialisera en array är att använda json_encode ()
funktion eller något liknande.
Efter att ha fått ett svar från arbetstagaren kommer vi att unserialisera det med json_decode ()
och skriv ut som CSV-rader:
Vi har just avslutat vårt kundskript, så låt oss springa från terminal:
php /vagrant/tuts-gearman-supervisor/code/client.phpMen det kommer att sitta fast utan någon utmatning. Varför? Det väntar på en arbetstagare att ansluta.
Skapa en arbetare
Det är dags att skapa en arbetare för att göra det jobb som beställdes av klienten. Vi kommer att kräva en fil med
Fibonacci ()
funktion och skapa en ny Gearman-arbetare på den aktuella servern:addServer ( '127.0.0.1');Efter det lägger vi till en ny funktion som heter samma som vi kallade den i klientkoden:
addFunction ('get_sequence', funktion ($ job) // avkodning $ content = $ job-> arbetsbelastning (); $ data = json_decode ($ content, true); // beräkna sekvens och returresultat $ rows = fibonacci $ data), returnera json_encode ($ rader););Och, glöm inte att paketera ditt svar till JSON-format. Den sista sak att göra är att lösa arbetarens manus för att använda det många gånger utan att starta om igen:
arbete();Vi kan köra arbetarskriptet i bakgrunden:
php /vagrant/tuts-gearman-supervisor/code/worker.php &För närvarande har du kanske redan sett att klientskriptet har avslutat sitt jobb och skrivit något så här:
vagrant @ localserver: ~ $ /vagrant/tuts-gearman-supervisor/code/client.php 1, 2, 3 2, 3, 5 3, 5, 8 5, 8, 13 8, 13, 21Kontrollera Gearman Status
Slutligen har vi vår arbetare igång, så vi kan kontrollera statusen igen:
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 varje rad finns ett funktionsnamn och tre nummer: antalet uppgifter i kön (0), antalet jobb som körs (1) och antalet anställda (2).
Naturligtvis, för att lägga till fler arbetstagare kan du köra fler arbetskript. För att stoppa var och en av dem kan du använda
döda alla
. Men det finns ett bra verktyg för att hantera arbetstagare, och det kallas tillsynsman.Några ord om handledare
Som manualen säger:
Handledare är ett klient / server system som låter sina användare övervaka och styra ett antal processer på UNIX-liknande operativsystem.Låt oss installera det och skapa den grundläggande konfigurationsfilen:
sudo apt-get installeringshandledare sudo nano /etc/supervisor/conf.d/supervisor.confI redigeraren som öppnar skapar vi en grundläggande konfiguration för en Gearman-arbetare:
[program: gearman-worker] command = php / vagrant/tuts-gearman-supervisor/code/worker.php autostart = true autorestart = true numprocs = 3 process_name = gearman-worker -% (process_num) sDetta kommer att säga till chefen att arbetaren måste springa i tre processer och starta om när han slutat. Spara nu konfigurationsfilen, uppdatera Supervisor och kontrollera statusen för körprocesserna:
vagrant @ localserver: ~ $ sudo supervisorctl reload Startad supervisord vagrant @ localserver: ~ $ sudo supervisorctl status gearman-arbetare: gearman-worker-0 RUNNING pid 4596, upptid 0:01:03 gearman-worker: gearman-worker-1 RUNNING pid 4595, upptid 0:01:03 gearman-arbetare: gearman-worker-2 RUNNING pid 4597, upptid 0:01:03Vi kan se tre arbetare som är redo att ta jobb från klientskript.
Slutsats
Vi har slutfört de grundläggande uppgifterna för att installera och konfigurera Gearman. Nu kan du spela med exempelkod, så försök att göra följande ändringar i koden:
Du kan också skala kraften hos dina arbetare genom att öka antalet processer eller köra dem på en snabbare server. Och glöm inte att använda chefen för att få dina arbetare att springa.
Om du har några frågor, tveka inte att ställa frågor i kommentarerna till artikeln.