Ciao, e benvenuto nella terza puntata della ventiquattresima stagione. Nella scorsa puntata abbiamo inquadrato il problema: servire tanti clienti insieme, quando il modo tradizionale spreca lavoratori fermi ad aspettare. Oggi scopriamo la risposta geniale e insolita di Node, il cuore tecnico di tutta la stagione, l'idea che spiega ogni suo pregio e ogni suo limite. È un modo di funzionare tanto semplice quanto controintuitivo, riassumibile in un'immagine: un solo cameriere velocissimo che non sta mai fermo. Il suo nome tecnico è il ciclo degli eventi. Oggi capiamo come funziona.
Partiamo dall'idea di fondo, che rovescia completamente il modello tradizionale, e voglio che la afferri bene. Invece di avere tanti lavoratori, uno per cliente, ognuno che si blocca ad aspettare, Node ne ha uno solo. Un unico lavoratore, un solo filo di esecuzione, che si occupa di tutti i clienti. Ma come può un solo lavoratore servire migliaia di clienti insieme? Ecco il segreto: quel lavoratore non si ferma mai ad aspettare. Ogni volta che dovrebbe attendere qualcosa, invece di restare fermo, va a occuparsi di qualcun altro, e torna al primo solo quando ciò che aspettava è pronto. Non aspettando mai, un solo lavoratore riesce a tenere occupati e serviti tutti.
Torniamo al ristorante, perché l'immagine chiarisce tutto in modo perfetto. Immagina un solo cameriere, ma velocissimo e sveglio, che serve un intero ristorante pieno. Va al primo tavolo, prende l'ordine, e lo porta in cucina. Ma poi, invece di restare fermo davanti alla cucina ad aspettare che il piatto sia pronto, cosa fa? Va subito al secondo tavolo, prende il suo ordine, lo porta in cucina, poi al terzo, e così via. Continua a girare tra i tavoli, prendendo ordini, senza mai fermarsi ad aspettare. E quando un piatto è pronto, la cucina lo avvisa, e lui va a servirlo al tavolo giusto. Un solo cameriere, non fermandosi mai ad aspettare, riesce a servire un ristorante intero, perché sfrutta i tempi morti delle attese per occuparsi di tutti gli altri.
Voglio che tu colga la genialità di questo, perché è davvero elegante. Il trucco è che, mentre la cucina prepara un piatto, cioè mentre si aspetta, il cameriere è libero di fare altro. L'attesa non lo blocca: la usa per servire altri tavoli. Così, invece di avere migliaia di camerieri fermi ad aspettare, ne basta uno solo, sveglio e velocissimo, che riempie ogni attimo di attesa occupandosi di qualcun altro. Ed è precisamente questo che rende il modello di Node così efficiente proprio per il lavoro di un server, che, come abbiamo visto, è fatto quasi tutto di attese. Node prende quelle attese, che nel modello tradizionale erano tempo sprecato, e le riempie servendo altri clienti. Trasforma lo spreco in efficienza.
Vediamo un po' più da vicino come funziona questo meccanismo. Il lavoratore unico gira in un ciclo continuo. Prende una cosa da fare e la comincia. Se è veloce, la finisce subito. Se invece richiede attesa, chiedere un dato alla base di dati per esempio, la avvia, la mette da parte dicendo avvisatemi quando è pronta, e passa alla cosa successiva senza aspettare. Intanto le cose in attesa, man mano che diventano pronte, si mettono in fila, e il lavoratore, tornando nel suo ciclo, le raccoglie e le completa. Gira così all'infinito: prendi qualcosa, se richiede attesa avviala e vai avanti, raccogli ciò che è diventato pronto, ripeti. Questo girare continuo, non fermandosi mai sulle attese, è il ciclo degli eventi.
Voglio collegare questo a un'immagine già incontrata, ma con una differenza. Ricordi il sistema operativo che fa il giocoliere, dando a tanti processi un pezzetto di tempo a turno? Il ciclo degli eventi ha qualcosa di simile, ma con una differenza cruciale: qui c'è un solo lavoratore, e non spartisce il tempo tra tante cose che calcolano, bensì riempie i tempi morti delle attese. Non è un giocoliere che spartisce il tempo, ma un cameriere che non sta mai fermo. E confrontalo con Go: Go metteva tanti lavoratori leggeri; Node ne mette uno solo, ma che non aspetta mai. Due modi opposti e ugualmente ingegnosi.
Voglio farti apprezzare, per chiudere, quanto sia radicale questa scelta. Quasi tutti i sistemi tradizionali usavano tanti lavoratori. Node ha scommesso su uno solo, puntando tutto sul non aspettare mai. È una scelta coraggiosa, che ha reso Node bravissimo in certe cose, servire tante connessioni di rete che aspettano molto, e come vedremo meno adatto ad altre. Ma soprattutto plasma tutto il modo di programmare in Node, perché lavorare per un filo che non deve mai fermarsi richiede un modo di pensare diverso, quello asincrono. Il ciclo degli eventi non è un dettaglio interno: è ciò che dà forma a tutto Node.
Per oggi ci fermiamo qui. La risposta geniale di Node al problema dei tanti clienti è avere un solo lavoratore, un solo filo, che però non si ferma mai ad aspettare: ogni volta che dovrebbe attendere qualcosa, va a occuparsi di altri clienti, e torna al primo solo quando ciò che aspettava è pronto, come un solo cameriere velocissimo che serve un intero ristorante sfruttando i tempi morti. Questo girare continuo, riempiendo le attese e non bloccandosi mai, è il ciclo degli eventi, ed è perfetto per il lavoro di un server, fatto quasi tutto di attese. È l'opposto della scelta di Go, e plasma tutto Node. Nella prossima puntata vediamo il modo di pensare che richiede: il pensiero asincrono. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.