多节点上的Node.js

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

那么它对于多核CPU和多CPU服务器的规模如何? 毕竟,尽可能快地构建单线程服务器非常棒,但对于高负载,我想要使用多个CPU。 同样的道理是让应用程序更快 - 看来今天的方式是使用多个CPU并行执行任务。

Node.js如何适合这张图片? 它的想法是以某种方式分配多个实例或什么?


[本帖最新截至2012年9月2日(比上述更新)]。

Node.js绝对可以在多核机器上进行扩展。

是的,Node.js是每进程一个线程。 这是一个非常慎重的设计决定,并且不需要处理锁定语义。 如果您不同意这一点,您可能还没有意识到调试多线程代码有多难。 有关Node.js过程模型的更深入的解释以及为什么它以这种方式工作(以及为什么它不会支持多线程),请阅读我的其他帖子。

那么我如何利用我的16核心盒呢?

两种方式:

  • 对于图像编码等繁重的计算任务,Node.js可以启动子进程或将消息发送到其他工作进程。 在这个设计中,你将有一个线程管理事件流和N个进程,执行繁重的计算任务并咀嚼其他15个CPU。
  • 为了在web服务上扩展吞吐量,您应该在一个框中运行多个Node.js服务器,每个核心运行一个服务器,并在它们之间拆分请求流量。 这提供了极好的CPU亲和力,并且将随着核心数量几乎线性地扩展吞吐量。

  • 扩展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之间进行了一次讨论(截至撰写本文,其最高职位)。 对此有几点意见:

  • 共享套接字模型非常便于允许多个进程在单个端口上侦听并竞争接受新连接。 从概念上讲,你可以想到Apache预先执行此操作的重要警告,即每个进程只接受一个连接然后死掉。 Apache的效率损失在分配新进程的开销中,并且与套接字操作无关。
  • 对于Node.js,让N个工作人员在一个套接字上竞争是非常合理的解决方案。 另一种方法是设置一个像Nginx这样的机顶盒前端,并将这种代理流量分配给各个工作人员,在工作人员之间交替分配新的连接。 这两种解决方案的性能特征非常相似。 而且,正如我上面提到的那样,无论如何,您可能希望Nginx(或其他选择)面向您的节点服务,这里的选择真的在两者之间:
  • 共享端口: 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

    下一篇: Exact time measurement for performance testing