2015-04-16 99 views
0

我的问题是当我打开一条快速路由时,群集崩溃中的工作人员之一。Node.js,Express,MongoDB - 群集工作者崩溃

4个工人:

API started on port 8000 
API started on port 8000 
API started on port 8000 
API started on port 8000 

然后我浏览到http://localhost:8000

worker 1 has died :(

工人死亡后,整个集群变得反应迟钝。 当我只使用一个cpu时它工作正常。

server.js

var cluster = require('cluster'); 


if(cluster.isMaster){ 

    var cpuCount = require('os').cpus().length; 

    // Create a worker for each CPU 
    for (var i = 0; i < cpuCount; i += 1) { 
     cluster.fork(); 
    } 

    cluster.on('exit', function(worker) { 
     console.log('worker:' + worker.id + " is dead"); 
     cluster.fork(); 
    }); 

} else { 
    var init = require('./config/init')(); 
    var config = require('./config/config'); 
    var mongoose = require('mongoose'); 
    var chalk = require('chalk'); 

    var db = mongoose.connect(config.db, function(err) { 
     if (err) { 
      console.error(chalk.red('Could not connect to MongoDB!')); 
      console.log(chalk.red(err)); 
     } 
    }); 

    var app = require('./config/express')(db); 

    app.listen(config.port); 

    require('./config/passport')(); 

    console.log('API started on port ' + config.port); 
} 
+0

当工人死亡时,记录退出/信号代码可能是值得的。请参阅[精细手册](https://nodejs.org/api/cluster.html#cluster_event_exit)。 – robertklep

回答

0

你可能想尝试JXcore,它支持多任务处理(单个进程下的线程/实例)。由于这个原因,集群不再需要。谁知道,也许这对你会更好。

所以我们说,你花一点点的工人代码(我只是将其粘贴在这里没有任何改变):

var init = require('./config/init')(); 
var config = require('./config/config'); 
var mongoose = require('mongoose'); 
var chalk = require('chalk'); 

var db = mongoose.connect(config.db, function(err) { 
    if (err) { 
    console.error(chalk.red('Could not connect to MongoDB!')); 
    console.log(chalk.red(err)); 
    } 
}); 

var app = require('./config/express')(db); 
app.listen(config.port); 
require('./config/passport')(); 
console.log('API started on port ' + config.port); 

,然后你mt-keep参数运行它(意思是:“多线程存活”) :

$ jxcore mt-keep:4 worker.js 

数量为4 cores4状态 - 请更改为适合您的平台。

请注意,我没有测试它。我只是展示了多进程集群的替代方案。另外,根据实现情况,JXcore可能更加高效。

有一篇为期一年的文章,重点介绍JXcore和Node.JS之间的性能差异:JXcore vs Vert.x vs Node.JS Cluster