
Di serverless, asincronia, Swoole
alberto • April 16, 2021
focusSwoole da qualche tempo è sulla bocca di tutti, anche grazie alla presentazione di Laravel Octane. Considerando che il neo-nato di casa Otwell è ancora in beta ed è forse troppo presto per una analisi approfondita, dedichiamo l'articolo all'engine sottostante, appunto Swoole.
Swoole è un application server, autonomo rispetto all'ecosistema Laravel, che permette di creare applicazioni scalabili e ad alte performance in PHP sfruttando concetti come stateful, asincronia e coroutines.
Per capire bene il valore di queste novità, occorre fare prima un po' di storia...
C'era una volta Apache e mod_php
Il primo setup che ha reso celebre PHP è stato il famoso LAMP
, acronimo di Linux, Apache, MySql e PHP.
Apache è un web server, un applicativo che viene avviato come demone e che è in ascolto sulle porte 80 (http) e 443 (https). Grazie ad un modulo, chiamato appunto mod_php
, Apache era in grado di "delegare" l'esecuzione di file PHP all'interprete installato sulla macchina.
Ad ogni richiesta di file PHP veniva quindi invocato l'interprete il cui output veniva inviato indietro al client. L'invocazione dell'interprete veniva fatta all'interno del processo Apache questo significava che configurazioni e permessi dipendevano appunto dal webserver.
Poi arrivo PHP-FPM
Grazie alle sempre piú maggiori richieste di performance e di velocità e alla progressiva migrazione da Apache a Nginx, si è resa necessaria una innovazione tecnologica che rendesse l'integrazione PHP-Apache meno vincolante e più performante.
Per queste ragioni è nato PHP-FPM (PHP FastCGI Process Manager). Con questa nuova tecnologia PHP viene avviato tramite un processo separato dal web server e viene interrogato internamente come se fosse un server a se stante.
Questo ha permesso di svincolarsi dal webserver utilizzato per gestire il layer HTTP e di considerare l'interprete PHP come un'entità autonoma, che potesse avere una vita propria, con possibilità di scaling e configurazioni dedicate rispetto al server web.
Ad oggi PHP-FPM è sicuramente il pattern migliore e maggiormente utilizzato quando deve essere setuppato un nuovo ambiente.
Stateless vs Stateful
Nonostante PHP-FPM abbia portato una ventata di aria fresca nel panorama PHP, non ha risolto tutti i problemi e le criticità presenti. Come con mod_php
, anche con questa tecnologia viene avviato un processo per ogni richiesta ricevuta e non esiste un vero "stato" tra le varie richieste.
Ad ogni richiesta di file PHP viene infatti avviato l'interprete ex-novo, come se fosse la prima volta. Questo concetto viene perfettamente espresso dalla keyword stateless, ovvero mancanza di stato.
Questa mancanza di stato non presenta solo aspetti negativi. Da un punto di vista della facilità di sviluppo e della affidabilità, questa caratteristica presenta dei vantaggi. Essendo ogni richiesta gestita in maniera autonoma, non esiste la possibilità di spaccare tutto in quanto, alla peggio, il danno viene localizzato all'interno della singola chiamata. Inoltre da un punto di vista dello sviluppo questo permette di ignorare le problematiche legate alla sincronicità e univocità dei dati tra richieste differenti.
D'altro canto un applicativo che girasse in modalità stateful avrebbe sicuramente maggiori benefici da un punto di vista prestazionale: il setup di un framework potrebbe avvenire solamente una volta per ogni ciclo di vita dell'application server e le connessioni verso sistemi terzi (database, cache, code...) potrebbero essere riutilizzate. Ovviamente a discapito di una maggior difficoltà per lo sviluppatore che deve tenere in considerazione questi aspetti.
Non credo che, per forza, debba esistere un pattern che sia migliore o superiore dell'altro. Semplicemente funzionano diversamente ed è compito dello sviluppatore sapere verso quale approccio propendere in base alle diverse situazioni.
L'asincronia nelle operazioni I/O
Il fatto di poter avere a disposizione un runtime stateful presenta ulteriori vantaggi. Uno dei più importanti è la possibilità di scrivere processi asincroni.
Le applicazioni web si interfacciano parecchio con terze parti durante il loro ciclo di vita: database per la persistenza dei dati, api esterne per recuperare eventualmente dati, server SMTP per l'invio delle mail, cache per accedere velocemente a dati...
Ogni volta che accediamo ad uno strumento terzo dobbiamo aspettare che esso ci risponda per poter andare avanti con le operazioni, mantenendo però un processo fermo, in attesa di una risposta.
La programmazione asincrona ci permette di sfruttare i tempi morti tra una operazione di I/O e l'altra parallelizzando i task e sfruttando al massimo le risorse messe a disposizione dalla nostra CPU.
Questo si può tradurre in un miglioramento delle performance importante, spesso si parla di una forbice che va da 10x a 100x di miglioramento. Mica bruscolini...
La rivoluzione Swoole
Swoole è un modulo PHP che permette di instanziare un server web direttamente nel runtime, permettendo, tra le tante cose, di passare da uno stack PHP stateless (LAMP e LEMP per esempio) ad uno stack stateful. L'applicazione quindi non sarà piú composta esclusivamente da singoli file PHP invocati da qualche altro attore, ma sarà essa stessa un application server, da riavviare ad ogni rilascio e da monitorare con maggiore attenzione. Molto più simile a quello che viene fatto con NodeJS o con Java.
Grazie a questo cambiamento radicale, Swoole è in grado di offrire molte altre cose, tra le quali la possibilità di eseguire task asincroni che permettono di interrogare servizi esterni con prestazioni di ordini di grandezza superiori rispetto al passato. Oltre a questo è possibile implementare server che supportino anche il protocollo TCP, i socket UNIX e gli, ormai non più recenti, WebSocket.
Ovviamente tutto questo non è completamente gratuito. O meglio, il modulo é open-source, ma il costo implementativo per poter sfruttare tutto questo aumenta.
Per limitare l'impatto e la difficoltà di sviluppo, Swoole introduce le coroutines, ovvero un componente software che permette di gestire task asincroni come se fossero di fatto sincroni, lasciando all'engine l'onere di gestire le callback ma mantenendo allo stesso tempo un livello prestazionale elevato.
Conclusioni
Swoole è uno dei principali attori di questo nuovo mondo. È probabilmente il più celebre e il piú utilizzato e come anticipato all'inizio, farà parte dello stack standard di Laravel Octane.
I vantaggi che questa nuova tipologia di applicazioni portano sono notevoli, ma come ogni cosa, queste feature sono compensate da difficoltà che, per quanto sono in parte mascherate, sono sempre dietro l'angolo.
Anche al netto di questo, Swoole, non è comunque la risposta a tutti i nostri problemi. È giusto conoscere le varie alternative, per sapere scegliere al momento giusto la miglior tecnologia. Rimane comunque positivo sapere che anche nell'ecosistema PHP (e Laravel) abbiamo a disposizione questo nuovo strumento.
E comunque tranquilli, il vostro prossimo progetto probabilmente si baserà ancora su PHP-FPM.