Il clustering è un concetto comune nelle applicazioni a grande scala per migliorare le prestazioni e l’affidabilità dividendo il lavoro tra più istanze del server. Node.js ha un modulo di clustering integrato che facilita l’implementazione di questo concetto.
Ecco un esempio di base su come potrebbe essere implementato:
```
const cluster = require(‘cluster’);
const http = require(‘http’);
const numCPUs = require(‘os’).cpus().length;
if (cluster.isMaster) { console.log(`Master ${process.pid} is running`);
// Fork workers. for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on(‘exit’, (worker, code, signal) => { console.log(`worker ${worker.process.pid} died`); }); } else { // Workers can share any TCP connection // In this case it is an HTTP server http.createServer((req, res) => { res.writeHead(200); res.end(‘hello world\n’); }).listen(8000); console.log(`Worker ${process.pid} started`); } ```In questo esempio, il programma principale è un server HTTP. Se è il processo principale (cluster.isMaster), forkiamo i processi figli per ogni CPU nel sistema. Ogni processo figlio condivide la stessa connessione TCP e ascolta sullo stesso porto.
Se un processo figlio muore, un evento ‘exit’ viene attivato sul processo principale. Puoi far gestire al tuo processo principale l’evento ‘exit’ per riforkare i processi figli se necessario, garantendo così che il tuo server non vada giù.
Questo è un esempio molto semplice. Le cose possono diventare molto più complicate quando inizi a considerare cose come la gestione delle sessioni utente e il bilanciamento del carico tra i processi figli.