多节点上的Node.js
Node.js看起来很有趣, 但我必须错过一些东西 - 是不是Node.js只能在单个进程和线程上运行?
那么它对于多核CPU和多CPU服务器的规模如何? 毕竟,尽可能快地构建单线程服务器非常棒,但对于高负载,我想要使用多个CPU。 同样的道理是让应用程序更快 - 看来今天的方式是使用多个CPU并行执行任务。
Node.js如何适合这张图片? 它的想法是以某种方式分配多个实例或什么?
[本帖最新截至2012年9月2日(比上述更新)]。
Node.js绝对可以在多核机器上进行扩展。
是的,Node.js是每进程一个线程。 这是一个非常慎重的设计决定,并且不需要处理锁定语义。 如果您不同意这一点,您可能还没有意识到调试多线程代码有多难。 有关Node.js过程模型的更深入的解释以及为什么它以这种方式工作(以及为什么它不会支持多线程),请阅读我的其他帖子。
那么我如何利用我的16核心盒呢?
两种方式:
扩展web服务的吞吐量
由于v6.0.X Node.js直接包含了集群模块,因此可以轻松设置多个节点工作站,可以监听单个端口。 请注意,这与通过npm提供的旧版learnboost“集群”模块不同。
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)
VS
单个端口: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
对于单个端口设置有一些好处(可能会减少进程之间的耦合,具有更复杂的负载平衡决策等),但设置起来肯定需要更多工作,并且内置群集模块的功耗很低 - 适用于大多数人的复杂性选择。
一种方法是在服务器上运行多个node.js实例,然后在它们前面放置一个负载平衡器(最好是一个像nginx一样的非阻塞的平衡器)。
Ryan Dahl在去年夏天在谷歌的技术讲座中回答了这个问题。 换句话说,“只需运行多个节点进程并使用合适的东西让它们进行通信,例如sendmsg()风格的IPC或传统的RPC”。
如果您想立即弄脏手,请查看spark2 Forever模块。 它使繁殖多节点进程非常简单。 它负责设置端口共享,以便每个端口都可以接受到同一端口的连接,并且如果您想确保某个进程在/当它死亡时重新启动,它们也会自动重新生成。
更新 - 10/11/11 :节点社区的共识似乎是Cluster现在是每台机器管理多个节点实例的首选模块。 永远也值得一看。
链接地址: http://www.djcxy.com/p/52533.html上一篇: Node.js on multi