2

CPU を集中的に使用するタスクを処理する必要がある SailsJs ( http://sailsjs.org/ ) ベースのアプリケーションがあります。つまり、cluster( https://nodejs.org/api/cluster.html ) モジュールを使用して、これらのタスクの処理をワーカー プロセスに委譲し、Sails アプリケーションのメイン イベント ループがブロックされないようにしたいと考えています (そして、通常どおりリクエストに対応できます)。

ワーカーを作成すると、EADDRINUSESails が再度実行して同じポートにバインドしようとするため、エラーが発生します。

サンプルコード:

// SomeSailsService.js

var cluster = require('cluster');
var Queue = require('bull');
var myQueue = Queue('myQueue', 'connection stuff', 'etc');
var numWorkers = 2;
var i;

if (cluster.isMaster) {
  // Spawn some workers
  for (i = 0; i < numWorkers; i++) {
    cluster.fork();
  }
} else {
  // This is a worker, so bind to new job event
  myQueue.process(function processJob(job, done) {
    // CPU intensive shenanigans
  });
}

module.exports = {
  addToQueue: function(foo) {
    myQueue.add({foo: foo});
  }
};

上記を実行すると、Sails アプリが起動し、起動時に 2 つのワーカーがアプリをさらに 2 回起動しようとします。これにより、次の 2 つのエラーが発生します。

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: bind EADDRINUSE
    at errnoException (net.js:904:11)
    at net.js:1084:30
    at Object.1:1 (cluster.js:594:5)
    at handleResponse (cluster.js:171:41)
    at respond (cluster.js:192:5)
    at handleMessage (cluster.js:202:5)
    at process.emit (events.js:117:20)
    at handleMessage (child_process.js:322:10)
    at child_process.js:396:7
    at process.handleConversion.net.Native.got (child_process.js:91:7)
    at process.<anonymous> (child_process.js:395:13)
    at process.emit (events.js:117:20)
    at handleMessage (child_process.js:322:10)
    at Pipe.channel.onread (child_process.js:347:11)

これを回避する方法はありますか?または、この問題に取り組む別の方法はありますか?

4

1 に答える 1