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

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

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


当前回答

集群模块允许您利用机器的所有核心。事实上,您可以使用非常流行的进程管理器pm2,在不修改代码的情况下,仅用两个命令就可以利用这一点。

npm i -g pm2
pm2 start app.js -i max

其他回答

一种方法是在服务器上运行多个node.js实例,然后在它们前面放置一个负载均衡器(最好是非阻塞的,如nginx)。

这个领域的新成员是LearnBoost的“Up”。

它提供“零停机重新加载”,并额外创建多个worker(默认为cpu数量,但可配置),以提供所有world中的最佳服务。

它是新的,但似乎相当稳定,我正在我目前的一个项目中愉快地使用它。

Spark2基于Spark,目前已不再维护。集群是它的继承者,它有一些很酷的特性,比如每个CPU核心生成一个工作进程,以及重生死亡的工作进程。

Node Js支持集群来充分利用你的cpu。如果您不使用集群运行它,那么您可能在浪费硬件功能。

Node.js中的集群允许你创建独立的进程,这些进程可以共享相同的服务器端口。例如,如果我们在端口3000上运行一个HTTP服务器,它就是一个运行在处理器单核上的单线程上的服务器。

下面显示的代码允许您对应用程序进行集群化。此代码是由Node.js表示的正式代码。

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

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

    Object.keys(cluster.workers).forEach(function(id) {
        console.log("I am running with ID : " + cluster.workers[id].process.pid);
    });

    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {

    //Do further processing.
}

查看这篇文章以获得完整的教程

node的未来版本将允许你fork一个进程并将消息传递给它,Ryan表示他想要找到一些共享文件处理程序的方法,所以它不会是一个直接的Web Worker实现。

目前还没有一个简单的解决方案,但它仍然处于早期阶段,node是我见过的移动最快的开源项目之一,所以期待在不久的将来会有一些很棒的东西。