LoginSignup
5
5

More than 5 years have passed since last update.

node.jsのclusterにてworker間でリソース共有を行ってみた

Posted at

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' }

5
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5