Node.js 多处理器上的节点(PM2、群集、重群集、无)

Node.js 多处理器上的节点(PM2、群集、重群集、无),node.js,pm2,Node.js,Pm2,我正在研究在多核环境中运行节点的选项 我正在努力确定最佳方法,到目前为止,我已经看到了这些选择 使用内置的群集库启动工作并响应信号 使用PM,但PM2-i被列为beta 零 重新聚集 还有其他选择吗?人们在生产中使用的是什么?我一直在使用默认的集群库,它工作得非常好。我有超过10000个concurrents(多台服务器上的多个集群),它工作得非常好 建议使用带有域的集群进行错误处理 这是直接从我已经做了一些改变,它如何产生新的集群为每个核心的机器。去掉了if/else,增加了express

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

我正在努力确定最佳方法,到目前为止,我已经看到了这些选择

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

还有其他选择吗?人们在生产中使用的是什么?

我一直在使用默认的集群库,它工作得非常好。我有超过10000个concurrents(多台服务器上的多个集群),它工作得非常好

建议使用带有域的集群进行错误处理

这是直接从我已经做了一些改变,它如何产生新的集群为每个核心的机器。去掉了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'));
        });
    });
}
var cluster=require('cluster'),
http=require('http'),
端口=process.env.PORT | | 1337,
os=require('os'),
服务器;
函数集(){
var cpuCount=os.cpus().length;
//为每个CPU创建一个工作进程
对于(变量i=0;i
我们用来管理Node.JS进程,在引导时启动它们,并在进程崩溃时充当看门狗

我们使用反向代理在侦听不同端口的进程之间进行负载平衡

通过这种方式,每个进程彼此隔离


例如:Nginx侦听端口80,并将流量转发到端口8000-8003。我使用PM2已有一段时间了,但它们的价格对于我的需求来说很昂贵,因为我有自己的分析环境,不需要支持,所以我决定尝试其他方法。就我的情况而言,just Everways做了一个非常简单的诀窍:

forever -m 5 app.js
另一个有用的例子是

forever start app.js -p 8080

这会自动为每个核心生成一个worker吗?似乎将同样的想法移植到表达上来是很直接的。这会自动为每个核心生成一个新集群。然后在每个else语句中启动express listener。我想app.listen()会返回包装好的服务器,所以这个服务器不会工作。server=app.listen()对不起,我做了两次var server。第二个不应该在那里。我正在移除它。@NiCkNewman这意味着每簇每秒一次。这可能是你想要的,也可能不是。如果需要,可以在master内部运行此函数,并使用PUB/SUB将事件委托给工作集群。不过,我不完全确定问题是什么。我建议问一个新的S/O问题并给我链接。您如何处理正常关机?我们将运行状况检查更改为返回404,同时我们完成处理其余请求,然后ELB停止向此服务器发送流量,所有之前的请求都是在关闭服务器之前处理的。1)如何知道何时可以安全地关闭服务器2)如何处理未捕获的异常?