-
Notifications
You must be signed in to change notification settings - Fork 3
/
cluster.js
68 lines (58 loc) · 2.23 KB
/
cluster.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
* -------------------------------------------------------------------------------
* cluster.js
*
* Provide a wrapper around the application that provides support for clusters.
* -------------------------------------------------------------------------------
*/
var fs = require('fs')
, _ = require('underscore')
, cfg = require('./config')
, config = {
readyWhen: 'listening'
}
;
// --------------------------------------------------------
// Adjust the CPU cores used if specified to do so. Otherwise
// use only one worker even if there are multiple cores.
// This is the safe default because if more workers are used,
// the installation also needs a reverse proxy like Nginx in
// front that implements sticky sessions. This is required
// due to the use of Socket.io.
// --------------------------------------------------------
if (cfg.cpu && cfg.cpu.workers && ! isNaN(parseInt(cfg.cpu.workers))) {
config.workers = cfg.cpu.workers;
} else {
config.workers = 1;
}
var recluster = require('recluster')
, path = require('path')
;
// Pass any arguments passed through to cluster processes.
if (process.argv.length > 2) config.args = process.argv.slice(2);
var cluster = recluster(path.join(__dirname, 'index.js'), config);
cluster.run();
process.on('SIGUSR2', function() {
console.log('Got SIGUSR2, reloading cluster...');
cluster.reload();
});
// --------------------------------------------------------
// Rebroadcast all messages from the workers to all
// workers (including the original sender).
// --------------------------------------------------------
_.each(cluster.workers(), function(worker) {
// For each worker, listen for messages.
console.log('Setting up listener for worker.id: ' + worker.id);
worker.process.on('message', function(msg) {
// For each message received, rebroadcast it to all workers.
_.each(cluster.workers(), function(worker) {
worker.process.send(msg);
});
});
});
console.log("spawned cluster, kill -s SIGUSR2", process.pid, "to reload");
// Write the pid to a file for reloading via scripts easily.
// TODO: fix this: for multi-process sites, the pids overwrite each other.
fs.writeFile('process.pid', '' + process.pid, function(err) {
if (err) throw err;
});