Scaling node.js application with cluster
Posted on January 15, 2015 • 2 minutes • 220 words
node.js
’s single thread default architecture prevents it from utilizing multi-cores machines. When you create a new node.js
application in WebStorm for example, this is what you get:
var debug = require('debug')('myApp');
var app = require('../app');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
// in app.listen method
app.listen = function(){
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
This code snippet will create a simple HTTP server on the given port, executed in a single-threaded process; doesn’t matter how many cores your machine has. This is where cluster
comes in.
cluster
allows you to create multiple processes, which can share the same port. Ideally, you should spawn only 1 thread per core.
var cluster = require("cluster"),
http = require("http");
cpuCount = require("os").cpus().length;
port = process.env.PORT || 3000
if (cluster.isMaster) {
for (var i = 0; i < cpuCount; ++i) {
cluster.fork();
}
cluster.on("exit", function(worker, code, signal) {
cluster.fork();
});
} else {
http.createServer(function(request, response) {
// ...
}).listen(port);
}
That’s how you do it on a single machine. With a few more lines of code, you application can now utilize better modern hardware. If this isn’t enough and you need to scale across machines, take a look at load balancing using nginx
. I will cover that in another post.