Node.js看起来很有趣,但我必须错过一些东西- Node.js不是调好只运行在一个进程和线程上吗?

那么如何针对多核cpu和多cpu服务器进行扩展呢?毕竟,单线程服务器的速度越快越好,但对于高负载,我希望使用多个cpu。同样的道理也适用于使应用程序更快——现在的方法似乎是使用多个cpu并并行化任务。

Node.js如何适应这种情况?它的想法是以某种方式分布多个实例还是什么?


当前回答

我使用Node worker以一种简单的方式从我的主进程运行进程。在我们等待官方方式的时候,似乎工作得很好。

其他回答

您可以使用集群模块。检查这个。

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Fork workers.
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {
    // Workers can share any TCP connection
    // In this case its a HTTP server
    http.createServer(function(req, res) {
        res.writeHead(200);
        res.end("hello world\n");
    }).listen(8000);
}

如上所述,Cluster将在所有核上扩展和负载平衡你的应用程序。 添加如下内容

cluster.on('exit', function () {
  cluster.fork();
});

将重新启动任何失败的工作。

现在,许多人也更喜欢PM2,它为您处理集群,还提供了一些很酷的监视特性。

然后,在运行集群的几台机器前添加Nginx或HAProxy,你就有了多级故障转移和更高的负载能力。

多节点利用您可能拥有的所有核心。 看看http://github.com/kriszyp/multi-node。

对于更简单的需求,您可以在不同的端口号上启动多个节点副本,并在它们前面放置一个负载均衡器。

也可以将web服务设计为几个独立的服务器,它们侦听unix套接字,这样就可以将数据处理等功能推到单独的进程中。

这类似于大多数脚本/数据库web服务器架构,其中cgi进程处理业务逻辑,然后通过unix套接字将数据推入和拉入数据库。

不同的是,数据处理被写入一个节点web服务器监听端口。

它更复杂,但最终是多核开发的必经之路。为每个web请求使用多个组件的多进程架构。

可以使用纯TCP负载均衡器(HAProxy)将NodeJS扩展到多个盒子,每个盒子运行一个NodeJS进程。

如果你有一些共同的知识在所有实例之间共享,你可以使用一个中央Redis存储或类似的,然后可以从所有流程实例访问(例如从所有盒子)