congregate
Version:
Node.js cluster on top of Flatiron CLI & Native cluster. Built with love!
99 lines (78 loc) • 3.54 kB
JavaScript
(function() {
"use strict";
var cli = require('../../app');
module.exports = function() {
var argv = cli.argv;
var cluster = require('cluster');
var totalShards = argv.shards || require('os').cpus().length,
signal = argv.signal || "SIGUSR2";
process.title = argv.name || "congregate-" + process.pid;
var app = argv.app || undefined;
if (!app && !process.env.CONG_APP_PATH) {
throw new Error("Neither --app passed to your entrypoint nor CONG_APP_PATH available as environment variable!");
}
if (!app && process.env.CONG_APP_PATH) {
app = process.env.CONG_APP_PATH;
}
if (cluster.isMaster) {
cluster.on('exit', function(shard, code) {
if (!shard.suicide) {
cli.log.info('oops! Your process shard crashed! Spawning a replacement '.cyan + '.');
// cluster.fork();
}
});
for (var i = 0; i < totalShards; i += 1) {
cluster.fork();
}
var stopShard = function stopShard(shard, fn) {
cluster.workers[shard].disconnect();
cluster.workers[shard].on('disconnect', function() {
cli.log.info('Shard: ' + shard + " has been stopped!".cyan);
return fn();
});
};
var restartShard = function restartShard(shards) {
var shard = shards.shift();
cli.log.info("Restarting Shard: " + shard);
stopShard(shard, function() {
var freshShard = cluster.fork();
freshShard.on('listening', function() {
cli.log.info("Refreshed Shard is back online! ");
if (shards.length > 0 ) {
restartShard(shards);
}
});
});
};
var shutdownShards = function(shards) {
var shard = shards.shift();
cli.log.info("Shutting Down your shard: ".cyan + shard);
stopShard(shard, function() {
if (shards.length > 0) {
shutdownShards(shards);
} else {
cli.log.info("Exiting the process finally!");
process.exit();
}
});
}
var stop = function() {
var shards = Object.keys(cluster.workers);
console.log(signal);
shutdownShards(shards);
};
// process.on(signal, function() {
// cli.log.verbose("Reloading Process Sharding Workers!");
// // delete the cached module, so we can reload the app
// delete require.cache[require.resolve(app)];
// var shards = Object.keys(cluster.workers);
// restartShard(shards);
// });
process.on('SIGTERM', stop);
process.on('SIGQUIT', stop);
} else {
require(require.resolve(app));
cli.log.info("Shard is running as: " + cluster.worker.id);
}
}
})();