Node.js看起来很有趣,但我必须错过一些东西- Node.js不是调好只运行在一个进程和线程上吗?
那么如何针对多核cpu和多cpu服务器进行扩展呢?毕竟,单线程服务器的速度越快越好,但对于高负载,我希望使用多个cpu。同样的道理也适用于使应用程序更快——现在的方法似乎是使用多个cpu并并行化任务。
Node.js如何适应这种情况?它的想法是以某种方式分布多个实例还是什么?
Node.js看起来很有趣,但我必须错过一些东西- Node.js不是调好只运行在一个进程和线程上吗?
那么如何针对多核cpu和多cpu服务器进行扩展呢?毕竟,单线程服务器的速度越快越好,但对于高负载,我希望使用多个cpu。同样的道理也适用于使应用程序更快——现在的方法似乎是使用多个cpu并并行化任务。
Node.js如何适应这种情况?它的想法是以某种方式分布多个实例还是什么?
当前回答
如上所述,Cluster将在所有核上扩展和负载平衡你的应用程序。 添加如下内容
cluster.on('exit', function () {
cluster.fork();
});
将重新启动任何失败的工作。
现在,许多人也更喜欢PM2,它为您处理集群,还提供了一些很酷的监视特性。
然后,在运行集群的几台机器前添加Nginx或HAProxy,你就有了多级故障转移和更高的负载能力。
其他回答
多节点利用您可能拥有的所有核心。 看看http://github.com/kriszyp/multi-node。
对于更简单的需求,您可以在不同的端口号上启动多个节点副本,并在它们前面放置一个负载均衡器。
您可以使用集群模块。检查这个。
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,你就有了多级故障转移和更高的负载能力。
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.
}
查看这篇文章以获得完整的教程
Ryan Dahl在去年夏天谷歌的技术演讲中回答了这个问题。换句话说,“只需运行多个节点进程,并使用一些合理的方法来允许它们进行通信。例如sendmsg()风格的IPC或传统的RPC”。
如果你想马上动手,看看spark2 Forever模块。它使得生成多个节点进程变得非常容易。它处理端口共享的设置,所以它们可以接受到同一个端口的连接,如果你想确保进程在死亡时重新启动,也可以自动重生。
更新:10/11/11:节点社区的共识似乎是,集群现在是管理每台机器的多个节点实例的首选模块。《永远》也值得一看。