Node.js看起来很有趣,但我必须错过一些东西 - Node.js 不是只调整为在单个进程和线程上运行吗?
那么它如何为多核 CPU 和多 CPU 服务器扩展?毕竟,使单线程服务器尽可能快是很棒的,但是对于高负载,我想使用多个 CPU。加快应用程序的速度也是如此——如今看来,方法是使用多个 CPU 并并行化任务。
Node.js 如何融入这张图?它的想法是以某种方式分发多个实例还是什么?
Node.js看起来很有趣,但我必须错过一些东西 - Node.js 不是只调整为在单个进程和线程上运行吗?
那么它如何为多核 CPU 和多 CPU 服务器扩展?毕竟,使单线程服务器尽可能快是很棒的,但是对于高负载,我想使用多个 CPU。加快应用程序的速度也是如此——如今看来,方法是使用多个 CPU 并并行化任务。
Node.js 如何融入这张图?它的想法是以某种方式分发多个实例还是什么?
Node.js 绝对可以在多核机器上扩展。
是的,Node.js 是每个进程一个线程。这是一个非常深思熟虑的设计决策,消除了处理锁定语义的需要。如果您不同意这一点,您可能还没有意识到调试多线程代码是多么困难。要更深入地解释 Node.js 进程模型以及它为什么以这种方式工作(以及为什么它永远不会支持多线程),请阅读我的另一篇文章。
两种方式:
由于 v6.0.X Node.js 已经包含了开箱即用的集群module,这使得设置可以在单个端口上侦听的多个节点工作程序变得容易。请注意,这与通过npm提供的较旧的 learnboost“集群”module不同。
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
工作人员将竞争接受新连接,负载最少的进程最有可能获胜。它工作得很好,并且可以在多核机器上很好地扩展吞吐量。
如果您有足够的负载来处理多个内核,那么您还需要做更多的事情:
在诸如Nginx或Apache 之类的 Web 代理之后运行您的 Node.js 服务- 可以进行连接限制(除非您希望过载条件完全关闭框)、重写 URL、提供静态内容和代理其他子服务。
定期回收您的工作进程。对于长时间运行的进程,即使是很小的内存泄漏最终也会累积。
设置日志收集/监控
PS:在另一篇文章的评论中,Aaron 和 Christopher 之间进行了讨论(在撰写本文时,它是最热门的文章)。对此有几点评论:
共享端口: nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
对比
个人端口: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
可以说,单独的端口设置有一些好处(可能减少进程之间的耦合,有更复杂的负载平衡决策等),但设置起来肯定需要更多的工作,而且内置的集群module是一个低-适用于大多数人的复杂性替代方案。
一种方法是在服务器上运行多个 node.js 实例,然后在它们前面放置一个负载平衡器(最好是非阻塞的,如 nginx)。
您可以使用集群module。检查这个。
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);
}
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.
}
查看本文以获取完整教程