Rendere le cose più veloci con Gearman e Supervisor

A volte i nostri servizi devono svolgere alcuni compiti enormi dopo l'interazione dell'utente. Ad esempio, dobbiamo inviare una lettera, generare un file di report o chiamare le API esterne. Questi tipi di attività possono essere lenti a causa di terze parti e possono consumare le risorse del tuo server.

In questo caso, un'applicazione può diventare un serpente che mangia un elefante, come nel libro Il piccolo Principe. Prendi alcuni dati da un utente e fallo aspettare perché il serpente ha bisogno di tempo per digerire un elefante (o qualcos'altro che la tua app deve fare):

Per elaborare più rapidamente questa funzionalità, è necessario creare le parti della propria applicazione asincrono. È possibile ottenere questo delegando questa attività a un server più potente o eseguendolo in un processo in background.

E Gearman è uno strumento appropriato che può essere utilizzato per fare questo.

Cosa faremo?

In questo tutorial creeremo una semplice applicazione che delegherà un'attività da un client al lavoratore di Gearman. La nostra applicazione calcolerà una sequenza di Fibonacci in tre processi. Per eseguire i processi di lavoro, installeremo e configureremo Supervisor.

Si prega di notare che gli esempi di questo tutorial richiedono l'esecuzione di PHP7.

Quindi, a cosa serve Gearman?

Per prima cosa, scopriamo cosa è Gearman dalla sua homepage:

Gearman fornisce un framework di applicazioni generiche per coltivare il lavoro su altre macchine o processi che sono più adatti a svolgere il lavoro. Ti consente di lavorare in parallelo, caricare l'elaborazione del bilanciamento e chiamare le funzioni tra le lingue. Può essere utilizzato in una varietà di applicazioni, dai siti Web ad alta disponibilità al trasporto di eventi di replica del database. In altre parole, è il sistema nervoso per il modo in cui l'elaborazione distribuita comunica.

In altre parole, Gearman è un sistema di accodamento facile da scalare su molti server e flessibile da utilizzare grazie al supporto multilingue.

Installa Gearman

Se stai usando Debian / Ubuntu, esegui il seguente comando per installare Gearman con gli strumenti necessari e l'estensione PHP:

sudo apt-get installa gearman php-gearman gearman-tools

Successivamente, avvia il server Gearman e verifica lo stato:

sudo gearmand -d gearadmin --status

Ma dopo il comando di stato non vedrai nulla di utile perché non abbiamo ancora avviato alcun worker. Ricorda questo finché non ne abbiamo bisogno.

Crea un cliente

E siamo pronti per iniziare uno script chiamato client.php. Questo script creerà un client Gearman e invierà informazioni a un server sulla stessa macchina:

addserver ( '127.0.0.1'); // config $ numbers = [1, 2]; // esegui un'attività con il lavoratore gearman $ res = $ client-> doNormal ('get_sequence', json_encode ($ numbers)); 

Potresti aver notato che abbiamo inviato numeri in formato JSON. I clienti ei lavoratori Gearman parlano tra loro in un formato stringa, quindi uno dei modi per serializzare un array è utilizzare il json_encode () funzione o qualcosa di simile.

Dopo aver ricevuto una risposta dal lavoratore, la sottoponiamo a unserialize con json_decode () e prodotto come file CSV:

Abbiamo appena terminato il nostro script client, quindi eseguiamolo dal terminale:

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

Ma sarà bloccato senza alcuna uscita. Perché? È in attesa che un lavoratore si connetta.

Crea un lavoratore

È ora di creare un lavoratore per fare il lavoro che è stato ordinato dal cliente. Richiederà un file con il Fibonacci () funzione e creare un nuovo worker Gearman sul server corrente:

addserver ( '127.0.0.1');

Dopodiché, aggiungeremo una nuova funzione chiamata la stessa che abbiamo chiamato nel codice client:

addFunction ('get_sequence', function ($ job) // decode input $ content = $ job-> workload (); $ data = json_decode ($ content, true); // calcola la sequenza e restituisce il risultato $ rows = fibonacci ( $ data); restituire json_encode ($ rows););

E, naturalmente, non dimenticare di avvolgere la tua risposta in formato JSON. L'ultima cosa da fare è far passare lo script worker per usarlo molte volte senza riavviare:

lavoro(); 

Possiamo eseguire lo script worker in background:

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

In questo momento, potresti aver già osservato che lo script client ha terminato il suo lavoro e scritto qualcosa del genere:

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

Controlla lo stato di Gearman

Infine, il nostro worker è in esecuzione, quindi possiamo controllare di nuovo lo stato:

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 

In ogni riga, c'è un nome di funzione e tre numeri: il numero di attività nella coda (0), il numero di lavori in esecuzione (1) e il numero di lavoratori capaci (2).

Ovviamente, per aggiungere più lavoratori, è possibile eseguire più script di lavoro. Per fermare ognuno di loro, puoi usare uccidi tutti.  Ma c'è un ottimo strumento per gestire i lavoratori, ed è chiamato Supervisor.

Alcune parole sul supervisore

Come dice il manuale:

Supervisor è un sistema client / server che consente agli utenti di monitorare e controllare un numero di processi su sistemi operativi UNIX-like.

Installiamolo e crea il file di configurazione di base:

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

Nell'editor che si apre, creeremo una configurazione di base per un lavoratore di Gearman:

[programma: gearman-worker] comando = php /vagrant/tuts-gearman-supervisor/code/worker.php autostart = true autorestart = true numprocs = 3 nome_ processo = gearman-worker -% (process_num) s 

Questo dirà a Supervisor che il lavoratore deve essere eseguito in tre processi e riavviare una volta terminato. Ora salva il file di configurazione, ricarica Supervisor e controlla lo stato dei processi in esecuzione:

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

Possiamo vedere tre lavoratori pronti a prendere lavoro dagli script client.

Conclusione

Abbiamo completato le attività di base per installare e configurare Gearman. Ora sei libero di giocare con il codice di esempio, quindi prova ad apportare le seguenti modifiche al codice:

  • Aggiungi un processo di lavoro in background, come l'invio di una e-mail.
  • Gioca con le priorità delle attività utilizzando GearmanClient :: doHigh.
  • Dati di blocco con GearmanJob :: sendData, che può essere utile nel caso di attività lunghe che possono essere osservate dalla barra di stato.

Inoltre, puoi ridimensionare la potenza dei tuoi dipendenti aumentando il numero di processi o eseguendoli su un server più veloce. E non dimenticare di usare Supervisor per far funzionare i tuoi dipendenti.

Se avete domande, non esitate a fare domande nei commenti all'articolo. 

Ulteriori letture e collegamenti correlati

  • Gearman Job Server
  • Gearman Service su php.net
  • Gearman UI per monitorare le attività di Gearman
  • Supervisore: un sistema di controllo del processo