martedì, dicembre 09, 2014

Ancora su modulo http in node.js

In questo post, traduco alcuni passaggi di un bell'articolo raggiungibile a questo indirizzo.

Scalabilità, big data, real time: queste le scommesse che node.js vuole vincere rispetto alla concorrenza grazie al suo modello di input/output non bloccante.

A patto di saper usare correttamente gli stream ...

Implementiamo un semplice server web che fornisca, ad ogni richiesta, il contenuto di un file statico presente sul server
 var http = require('http'),   
    fs = require('fs');  
    
 var server = http.createServer(function (req, res) {  
       fs.readFile(__dirname + '/data.txt', function (err, data) {  
       res.end(data);  
    });  
 });  
    
 server.listen(8000);  
La soluzione presentata funzione alla perfezione, collegatevi con un browser all'indirizzo localhost:8080, dopo aver mandato in esecuzione il programma, e riceverete il contenuto del file data.txt presente nella directory di lavoro, rappresentata dalla variabile globale __dirname.

Il programma legge il file in modalità asincrona e poi esegue la funzione di callback che ne scrive il contenuto sullo stream associato alla risposta: peccato che tutto il file venga prima caricato in memoria; se arrivano n richieste contemporanee  (con n speriamo grande :)), il nostro server si troverà seduto in men che non si dica.

Per rendere il nostro server scalabile, dobbiamo utilizzare un altro approccio, basato sul corretto utilizzo di stream e pipe
 var http = require('http'),   
     fs = require('fs');  
    
 var server = http.createServer(function (req, res) {  
        var stream = fs.createReadStream(__dirname + '/data.txt');  
        stream.pipe(res);  
     });  
 server.listen(8000);  
Creaiamo uno stream in lettura associato al file come sorgente dati e lo mandiamo sullo stream della risposta tramite la pipe.

Con questa soluzione, i dati verranno mandati al server, in blocchi, non appena disponibili, senza necessità di bufferizzazione sul server.

Con i prossimi post, vedremo come implementare un server web per creare la nostra prima applicazione web dinamica.

Ho aggiornato su github il progetto, effettuate un git pull per aggiornare i sorgenti che avete in locale, come mostrato in questo post

Come al solito, per dubbi e/o domande: commentate!

Alla prox.
Ivan

Nessun commento:

Posta un commento