我发现Tomislav Capan撰写的这篇博文非常清楚地解释了这一点:
的 Why The Hell Would I Use Node.js? A Case-by-Case Introduction 强>
我对它的要点的解释,对于节点0.10,与Apache相比:
好的部分
- Node.js避免为每个请求启动线程,或者不需要像Apache那样处理对一组线程的请求池。因此,它处理请求的开销较小,并且擅长快速响应。
- Node.js可以将请求的执行委托给单独的组件,并专注于新请求,直到委托组件返回处理结果为止。这是异步代码,并且可以通过事件模型实现。 Apache在池中串行执行请求,并且当其中一个模块只是等待任务完成时,不能重用该线程。然后,Apache将对请求进行排队,直到池中的线程再次可用。
- Node.js会谈JavaScript ,因此非常快速地传递和操作从外部Web API源(如MongoDB)检索到的JSON,从而减少了每个请求所需的时间。像PHP这样的Apache模块可能需要更多时间,因为它们无法有效地解析和操作JSON,因为它们需要marshalling来处理数据。
坏的部分
注意:下面列出的大多数不良内容都将通过即将推出的版本0.12进行改进,这是值得注意的。
- Node.js在计算密集型任务中很糟糕,因为每当它执行长时间运行时,由于其单线程,它将对所有其他传入请求进行排队。 Apache通常会有更多线程可用,并且操作系统将在这些线程之间整齐且公平地调度CPU时间,仍允许处理新线程,尽管速度稍慢。除非Apache中的所有可用线程都处理请求,否则Apache也将开始排队请求。
- Node.js不能充分利用多核CPU ,除非您创建Node.js群集或启动子进程。具有讽刺意味的是,如果你做后两者,你可能会增加更多编排开销,这与Apache有相同的问题。从逻辑上讲,您还可以启动更多的Node.js进程,但这不是由Node.js管理的。你必须测试你的代码,看看哪些更好; 1)Node.js中的多线程与集群和子进程,或2)多个Node.js进程。
的缓解
所有服务器平台都有一个上限。 Node.js和Apache都会在某个时刻到达它。
- 当你有大量的计算任务时,Node.js会以最快的速度到达它。
- 当你向它发出大量需要长串行执行的小请求时,Apache会以最快的速度到达它。
您可以做三件事来扩展Node.js的吞吐量
- 利用多核CPU ,设置cluster,使用child processes,或使用Phusion Passenger等多进程协调器。
- 设置与消息队列连接的辅助角色。这将是针对计算密集型长期运行请求的最有效解决方案;将它们卸载到工作场。这会将您的服务器分为两部分; 1)面向公众的文书服务器接受来自用户的请求,2)私人工作服务器处理长时间运行的任务。两者都与消息队列连接。文书服务器将消息(传入的长时间运行的请求)添加到队列中。工作者角色侦听传入消息,处理这些消息,并可能将结果返回到消息队列中。如果需要请求/响应,则文书服务器可以异步等待响应消息到达消息队列。消息队列的示例包括RabbitMQ和ZeroMQ。
- 设置负载均衡器并启动更多服务器。现在您可以有效地使用硬件并委派长时间运行的任务,您可以水平扩展。如果您有负载均衡器,则可以添加更多文书服务器。使用消息队列,您可以添加更多工作服务器。您甚至可以在云中进行设置,以便按需扩展。
醇>
这取决于你如何使用它。 Node.js默认是单线程的,但是使用(相对)新的集群模块,您可以跨多个线程水平扩展。
此外,您的数据库需求还将决定节点的缩放效果。例如,将MySQL与node.js一起使用将不会获得与使用MongoDB一样多的好处,因为MongoDB和node.js都具有事件驱动的特性。
以下链接有很多不同设置的系统基准测试:
http://www.techempower.com/benchmarks/
Node.js排名不是最高,但与使用nginx的其他设置相比(在他们的桌子上没有apache,但足够接近)它确实很好。
但同样,这在很大程度上取决于您的需求。我相信如果你只是服务静态网站,建议你坚持使用更传统的堆栈。然而,人们已经使用node.js做了一些令人惊奇的事情以满足其他需求:http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/(c10k?ha!)
编辑:值得一提的是,你真的不是用node.js'替换'apache。你将取代apache和php(在典型的灯堆中)。