Skip to content

Instantly share code, notes, and snippets.

@sam-github
Last active December 18, 2015 17:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sam-github/5818974 to your computer and use it in GitHub Desktop.
Save sam-github/5818974 to your computer and use it in GitHub Desktop.
var cluster = require('cluster')
, net = require('net');
if (cluster.isMaster) {
console.log('master: node version', process.version);
var worker = cluster.fork();
worker.on('online', function() {
console.log('master: on worker/online');
});
worker.on('message', function(msg) {
console.log('master: on worker/message - ', msg);
if (msg === 'ONLINE') {
console.log('master: worker.disconnect()');
worker.disconnect();
}
});
worker.on('disconnect', function() {
console.log('master: on worker/disconnect');
});
} else {
var server
, client
, host = process.argv[2] || 'localhost'
, port = 80
, addr
, accept
, timeout;
if (host === 'localhost') {
server = net.createServer()
.listen(0, function() {
port = server.address().port;
console.log('worker: listen on port', port);
createClient();
})
.on('connection', acceptClient)
.on('close', function() {
console.log('worker: on server/close');
});
function acceptClient(_) {
accept = _; // hm, do we have to prevent it being GCed?
console.log('worker: accept', accept.address());
accept.on('close', function() {
console.log('worker: on accept/close');
});
accept.on('end', function() {
console.log('worker: on accept/end, .end() our side');
accept.end();
});
}
} else {
createClient();
}
function createClient() {
console.log('worker: connect to port', port, 'host', host);
client = net.connect(port, host)
.on('connect', function() {
console.log('worker: on client/connect, send ONLINE to master');
process.send('ONLINE');
});
}
function closeClient() {
clearTimeout(timeout);
console.log('worker: client.close()');
client.end();
client.on('close', function(with_error) {
console.log('worker: on client/close, error?', with_error);
});
}
process.on('disconnect', function() {
console.log('worker: on process/disconnect');
closeClient();
});
cluster.on('disconnect', function() {
console.log('worker: on cluster/disconnect');
});
cluster.worker.on('disconnect', function() {
console.log('worker: on cluster.worker/disconnect');
});
cluster.worker.process.on('disconnect', function() {
console.log('worker: on cluster.worker.process/disconnect');
});
cluster.worker.process.on('internalMessage', function(msg) {
console.log('worker: on cluster.worker/internalMessage', msg);
if (msg.cmd === 'NODE_CLUSTER_disconnect') {
console.log('worker: internal disconnect.... set 30 second timeout');
timeout = setTimeout(function() {
console.log('worker: failed to receive disconnect, close the client!\n\n');
closeClient();
}, 10000);
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment