// Parent
var child = require('child_process').fork('child.js');
// Open up the server object and send the handle.
var server = require('net').createServer();
server.on('connection', function (socket) {
socket.end('handled by parent');
});
server.listen(1337, function() {
child.send('server', server);
});
//Child
process.on('message', function(m, server) {
if (m === 'server') {
server.on('connection', function (socket) {
socket.end('handled by child');
});
}
});
As shown in above example , parents sends server object to child process so that even child had handle some of client connection requests.
How is it achieved in node js ?
I suggest you take a look at node.js cluster module:
When you call
server.listen(...)
in a worker, it serializes the arguments and passes the request to the master process. If the master process already has a listening server matching the worker's requirements, then it passes the handle to the worker. If it does not already have a listening server matching that requirement, then it will create one, and pass the handle to the child.
Complete example from the docs:
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// Workers can share any TCP connection
// In this case its a HTTP server
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}
Here is what node does when process.send
is called with a handle
argument.
And after reading that, the handleConversion
function is also interesting to read.
I don't fully understand it yet, but I think essentially the state of the socket/server is serialized and passed between master/worker using IPC. Maybe the state being passed around is enough for each process to bind itself to the socket? Or maybe the parent is keeping a registry of children who can handle any given socket, so once a new connection comes in for some socket, it is sent to a child that registered for it. That part I am less sure about.