node初心者の僕はnode.jsでcluster構成を取っている場合、
worker間でリソースを共有する方法が分からず、とりあえず以下のような実装をしてみました。
もし他に良いやり方を知っている方がいたら教えてください。
server.js
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length; // worker数
if (cluster.isMaster) {
var sharedData = {}; // worker間で共有されるデータ
var counter = 0;
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
Object.keys(cluster.workers).forEach(function(id) {
var worker = cluster.workers[id];
worker.on('message', function(msg){
sharedData[counter++] = msg.data; // 共有されていることをチェックするためのdataを作成する
worker.send({"requestKey":msg.requestKey,"data":sharedData});
});
});
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
var reqMap = {};
var counter = 0;
http.createServer(function(req, res) {
res.writeHead(200);
res.end();
var requestKey = Math.random(); // 本来ならrequest毎に一意になるkeyを付ける必要があるが
reqMap[requestKey] = function(data) {
//他のworkerのdataも見れるかチェック
console.log(data);
};
var workerData = process.pid + ":" + counter++; // worker間で共有したい情報
process.send({ "requestKey": requestKey, "data": workerData });
}).listen(8000);
process.on('message', function(msg) {
reqMap[msg.requestKey](msg.data);
reqMap[msg.requestKey] = null;
});
}
実行結果
$ node server.js
{ '0': '68512:0' }
{ '0': '68512:0', '1': '68511:0' }
{ '0': '68512:0', '1': '68511:0', '2': '68513:0' }
{ '0': '68512:0', '1': '68511:0', '2': '68513:0', '3': '68514:0' }