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

老实说,我还没有完全理解它 – 我甚至知道Node.js是如何工作的,作为使用事件模型的单线程。我只是不知道这是如何比Apache更好,以及如何水平缩放,如果它是单线程的。

解决方法

我发现这篇博客Tomislav Capan解释很好:
Why The Hell Would I Use Node.js? A Case-by-Case Introduction

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

好的部分

> Node.js避免为每个请求分配线程,或者不需要处理对Apache这样的线程集合的请求。因此,它具有较少的处理请求的开销,并且擅长快速响应。
> Node.js可以将请求的执行委托给一个单独的组件,并专注于新的请求,直到委托组件返回已处理的结果。这是异步代码,并且通过事件模型实现。 Apache在池中以串行方式执行请求,并且当其中一个模块只是等待任务完成时,它不能重用线程。 Apache将对请求进行排队,直到池中的线程再次可用。
> Node.js谈论JavaScript,因此在传递和操纵从外部Web API源(如MongoDB)检索的JSON时速度非常快,从而减少了每个请求所需的时间。 Apache模块,如PHP,可能需要更多的时间,因为他们不能有效地解析和操纵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的吞吐量

>通过设置cluster,使用child processes或使用多进程编排器(如Phusion Passenger)来利用多核cpu
>设置与消息队列连接的工作者角色。这将是针对计算密集型长时间运行请求的最有效的解决方案;将它们卸载到工作站中。这将分成两部分的服务器: 1)接受来自用户的请求的面向公众的文书服务器,以及2)处理长时间运行的任务的私人工作服务器。两者都与消息队列连接。文书服​​务器将消息(传入长时间运行的请求)添加到队列。工作者角色监听传入的消息,处理它们,并可以将结果返回到消息队列中。如果需要请求/响应,则文书服务器可以异步地等待响应消息到达消息队列。消息队列的示例为RabbitMQZeroMQ。>设置负载均衡器并启动更多服务器。现在,您可以有效地使用硬件和委派长时间运行的任务,您可以水平缩放。如果您有负载平衡器,可以添加更多的文书服务器。使用消息队列,可以添加更多工作服务器。你甚至可以在云中设置,以便您可以按需扩展。

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...