5. Scalable Server-Side Code with JavaScript
Node Up and Running
Tom Hughes-Croucher
http://ofps.oreilly.com/titles/9781449398583/
http://shop.oreilly.com/product/0636920015956.do
@sh1mmer
10. var http = require('http');
var server = http.createServer();
server.listen(8000);
server.on('request', function(req,res) {
var doodad = new Doodad();
res.writeHead(200,{'Content-Type':'text/doodad'});
res.end(doodad);
});
@sh1mmer
18. var http = require('http'), fs = require('fs');
var server = http.createServer();
server.listen(8000);
server.on('request', function(req,res) {
var screen = fs.readFileSync('/factory1/screen');
var dial = fs.readFileSync('/factory2/dial');
var doodad = new Doodad(screen, dial);
res.writeHead(200,{'Content-Type':'text/doodad'});
res.end(doodad);
});
@sh1mmer
26. var stream = require('stream');
var s = new stream.Stream(); //I am an EventEmitter
s.readable = true; //now I implement read API
s.emit('data', "my data");
s.emit('end'); //I'm done sending data
@sh1mmer
27. var stream = require('stream');
var s = new stream.Stream(); //I am an EventEmitter
s.writable = true; //now I implement write API
s.data = "";
s.write = function(d) {
s.data += d;
};
s.end = function() {
if(s.data) { console.log(s.data) }
};
s.destroy = function() {
s.writable = false;
}
@sh1mmer
28. The too many parts
problem and why
phone calls don't work
@sh1mmer
33. Managing Backpressure
• Manage Buffer sizes
• Use pause() / resume() to control back
pressure
• Assume that 'data' event may happen after
pause
• Remember node buffer -> kernel buffer
@sh1mmer
36. New Streams TBD
• Writable streams
• Same
• Readable (https://github.com/isaacs/readable-stream)
• configurable stream buffer waterline
• 'readable' event
• read(len) -> returns data
• Pipe
• Subscribers must implement readable stream
• No more direct access with Pipe