多个处理器上的NodeJS(PM2,群集,重新群集,无)

我正在研究在多核环境中运行节点的选项。

我试图确定最好的方法,到目前为止我已经看到了这些选项

  • 使用内置的集群库来启动工作并响应信号
  • 使用PM但是,PM2 -i被列为beta。
  • 再群集

还有其他的select吗? 什么是乡亲在生产中使用?

我一直在使用默认的集群库,它工作得很好。 我已经有超过10,000个并发(多个服务器上的多个集群),并且工作得很好。

build议使用具有域的群集进行error handling。

这是直接从http://nodejs.org/api/domain.html解除我已经做了一些改变,如何为您的机器的每个核心产生新的集群。 摆脱了if / else并加上了express。

var cluster = require('cluster'), http = require('http'), PORT = process.env.PORT || 1337, os = require('os'), server; function forkClusters () { var cpuCount = os.cpus().length; // Create a worker for each CPU for (var i = 0; i < cpuCount ; i += 1) { cluster.fork(); } } // Master Process if (cluster.isMaster) { // You can also of course get a bit fancier about logging, and // implement whatever custom logic you need to prevent DoS // attacks and other bad behavior. // // See the options in the cluster documentation. // // The important thing is that the master does very little, // increasing our resilience to unexpected errors. forkClusters () cluster.on('disconnect', function(worker) { console.error('disconnect!'); cluster.fork(); }); } function handleError (d) { d.on('error', function(er) { console.error('error', er.stack); // Note: we're in dangerous territory! // By definition, something unexpected occurred, // which we probably didn't want. // Anything can happen now!Be very careful! try { // make sure we close down within 30 seconds var killtimer = setTimeout(function() { process.exit(1); }, 30000); // But don't keep the process open just for that! killtimer.unref(); // stop taking new requests. server.close(); // Let the master know we're dead.This will trigger a // 'disconnect' in the cluster master, and then it will fork // a new worker. cluster.worker.disconnect(); } catch (er2) { // oh well, not much we can do at this point. console.error('Error sending 500!', er2.stack); } }); } // child Process if (cluster.isWorker) { // the worker // // This is where we put our bugs! var domain = require('domain'); var express = require('express'); var app = express(); app.set('port', PORT); // See the cluster documentation for more details about using // worker processes to serve requests.How it works, caveats, etc. var d = domain.create(); handleError(d); // Now run the handler function in the domain. // // put all code here. any code included outside of domain.run will not handle errors on the domain level, but will crash the app. // d.run(function() { // this is where we start our server server = http.createServer(app).listen(app.get('port'), function () { console.log('Cluster %s listening on port %s', cluster.worker.id, app.get('port')); }); }); } 

我们使用Supervisor来pipe理我们的Node.JS进程,在启动时启动它们,并在进程崩溃时充当看门狗。

我们使用Nginx作为反向代理来负载平衡监听不同端口的进程之间的stream量

这样每个进程都是隔离的。

例如:Nginx侦听端口80,并将stream量转发到端口8000-8003

我使用了PM2很长一段时间,但是由于我有我自己的分析环境,而且我不需要支持,所以他们的定价对于我的需求来说是昂贵的,所以我决定尝试替代scheme。 对我来说,只是永远的伎俩,其实很简单:

 forever -m 5 app.js 

另一个有用的例子是

 forever start app.js -p 8080