什么特别使Node.js比Apache更具扩展性?

说实话,我还没有完全理解它 – 甚至我甚至都明白Node.js是如何工作的,作为使用事件模型的单个线程。 我只是不明白这比Apache更好,如果它是单线程的,它如何水平扩展。

我发现Tomislav Capan的这篇博客很好地解释了这一点:
为什么我会使用Node.js? 逐案介绍

我对它的要点的解释,对于节点0.10,与Apache相比:

好的部分

  • Node.js避免了为每个请求启动线程 ,或者不需要像Apache一样处理请求到一组线程的请求。 因此处理请求的开销较小,并且擅长快速响应。
  • Node.js可以将请求的执行委托给一个单独的组件,并专注于新的请求,直到委托的组件返回处理结果。 这是asynchronous代码,通过事件模型成为可能。 Apache在池中以串行方式执行请求,并且当其中一个模块仅等待任务完成时,不能重用该线程。 然后,Apache将对请求进行排队,直到池中的线程再次可用。
  • Node.js使用JavaScript ,因此可以非常快地传递和操纵从外部Web API源(如MongoDB)检索的JSON,从而减less每个请求所需的时间。 像PHP这样的Apache模块可能需要更多时间,因为它们不能有效地parsing和操纵JSON,因为它们需要编组来处理数据。

坏的部分

注意:下面列出的大部分坏的部分将会随着即将到来的版本0.12而改善,需要注意的东西。

  • Node.js吸收计算密集型任务 ,因为每当它做了很长时间的运行,由于它的单线程,它将排队所有其他传入的请求。 Apache通常会有更多的线程可用,操作系统将整齐地在这些线程之间调度CPU时间,但仍然允许处理新的线程,虽然速度稍慢。 除了Apache中所有可用的线程正在处理请求,Apache都会启动排队请求。
  • Node.js不能充分利用多核CPU ,除非你创build一个Node.js集群或者启动subprocess。 具有讽刺意味的是,如果你做了后两者,你可能会增加更多的编排开销,这与Apache有相同的问题。 从逻辑上讲,你也可以启动更多的Node.js进程,但这不是由Node.jspipe理的。 你将不得不testing你的代码,看看哪个更好。 1)使用集群和subprocess从Node.js中进行multithreading,或2)多个Node.js进程。

缓解措施

所有的服务器平台都有一个上限。 Node.js和Apache都会在某个时候到达它。

  • 当你有繁重的计算任务时,Node.js会达到最快。
  • 当你抛出大量需要长时间连续执行的小请求时,Apache将达到最快速度。

你可以做三件事来扩展Node.js的吞吐量

  1. 使用多核CPU ,通过设置一个集群 ,使用subprocess ,或使用Phusion Passenger等多进程协调器。
  2. 设置与消息队列连接的工作者angular色 。 这将是针对计算密集型长时间运行请求的最有效的解决scheme; 把它们卸载到一个工作农场。 这将把你的服务器分成两部分。 1)面向接受用户请求的公用服务器,以及2)处理长时间运行任务的私人工作服务器。 两者都与消息队列连接。 文书服​​务器将消息(传入的长时间运行的请求)添加到队列中。 工作angular色侦听传入的消息,处理这些消息,并将结果返回到消息队列中。 如果需要请求/响应,则文书服务器可以asynchronous地等待响应消息到达消息队列。 消息队列的例子是RabbitMQ和ZeroMQ 。
  3. 设置一个负载平衡器并启动更多的服务器。 现在您可以高效地使用硬件并委派长时间运行的任务,您可以水平缩放。 如果您有负载平衡器,则可以添加更多的文书服务器。 使用消息队列,可以添加更多的工作服务器。 你甚至可以在云端进行设置,以便按需扩展。

这取决于你如何使用它。 Node.js默认是单线程的,但是使用(相对)新的集群模块,可以跨多个线程水平扩展。

此外,您的数据库需求也将决定如何有效缩放与节点。 例如,使用MySQL和node.js,由于MongoDB和node.js的事件驱动性质,使用MongoDB几乎没有什么好处。

以下链接有不同的设置系统很好的基准: http : //www.techempower.com/benchmarks/

Node.js并不排名最高,但与使用nginx的其他设置(在他们的表上没有Apache,但足够接近)相比,它相当不错。

虽然如此,它高度依赖于您的需求。 我相信,如果你只是提供静态网站,build议你坚持一个更传统的堆栈。 然而,人们用node.js做了一些令人惊奇的事情来满足其他的需求: http : //blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ (c10k?ha!)

编辑:值得一提的是,你真的不能用node.js来replaceApache。 你会取代Apache和PHP(在一个典型的灯栈)。