Göra saker snabbare med Gearman och Supervisor

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.

Vad ska vi göra?

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.

Så vad är Gearman Hur som helst?

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.

Installera Gearman

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.

Skapa en klient

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.php 

Men 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, 21

Kontrollera 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.php 

I 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.conf 

I 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) s 

Detta 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:03 

Vi 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:

  • Lägg till lite arbetarprocess i bakgrunden, som att skicka ett e-postmeddelande.
  • Spela med uppgiftsprioriteringar med GearmanClient :: doHigh.
  • Chunk-data med GearmanJob :: sendData, vilket kan vara användbart vid långa uppgifter som kan observeras av statusfältet.

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. 

Ytterligare läsning och relaterade länkar

  • Gearman Job Server
  • Gearman Service på php.net
  • Gearman-användargränssnittet för att övervaka Gearman-uppgifter
  • Handledare: Ett processkontrollsystem