Il concetto di concorrenza in applicazioni Node.JS

Come gestire la concorrenza in applicazioni multitask utilizzando gli strumenti messi a disposizione da Node.JS

Approfondimenti

Per eseguire il codice di pagina precedente basta copiare ed incollare il sorgente all’interno di un file, che per comodità chiameremo server.js. Andremo poi ad eseguirlo digitando il comando node server.js. Il risultato dovrebbe essere seguente:

multithreading_01
Figura 1 – Esecuzione del server

Dalla finestra di esecuzione si vede come le attività vengano gestite simultaneamente, nel rispetto del timing previsto, assieme alle richieste che giungono sul server HTTP. Come già detto, questo risultato non ha nulla che vedere con la programmazione multithreading, perché stiamo usando un approccio completamente diverso, detto event-driven. Il risultato è comunque più che soddisfacente: procediamo quindi al confronto con l’approccio della normale programmazione multithreading.
Dal punto di vista delle performance l’approccio di Node.js, almeno per server di piccole dimensioni, dovrebbe essere vantaggioso. L’orientamento agli eventi permette di risparmiare parecchio tempo macchina, perché le varie funzioni vengono attivate soltanto quando serve. Al contrario, nella programmazione multithreading, di solito i vari thread vengono messi “a dormire” tra una richiesta all’altra, ma di fatto continuano a restare “idle” e sono quindi presenti nell’elenco delle cose da gestire da parte del sistema operativo.
Le cose cambiano quando passiamo a server di grandi dimensioni. Se il numero di richieste è molto elevato, o le attività concorrenti numerose, l’approccio offerto da Node.js potrebbe non sembrare adeguato ad un servizio professionale. A questo punto entra in gioco il significato del nome Node.js. I creatori di questo linguaggio non hanno scelto il nome a caso. L’idea è quella di creare un server composto da moduli di piccole dimensioni, che possono essere considerati dei “mini server” autonomi nel loro funzionamento. Ciascuno di essi va considerato come un nodo del sistema, da cui appunto il nome Node.js.
Affinché l’architettura funzioni è necessario che questi “mini server” dialoghino tra loro, scambiandosi tutte le formazioni necessarie. Questo spiega perché la comunicazione e lo scambio di dati è un aspetto molto importante se vogliamo lavorare con Node.js. Ad esempio, la chat via TCP/IP che abbiamo visto nella quinta lezione non è un’applicazione frivola come sembra, ma al contrario presenta un primo esempio di comunicazione tra nodi differenti. Per sfruttare a fondo la flessibilità e la scalabilità offerta da questo approccio, nelle prossime lezioni approfondiremo l’argomento della comunicazione dei diversi componenti.