2013-07-30 40 views
5

所以我开始为我正在做的项目使用node.js。cpu密集任务的子进程?

当客户端发出请求时,我的node.js服务器从另一个服务器获取一个json,然后将其重新格式化为一个新的json,并将其提供给此客户端。但是,节点服务器从其他服务器获得的json可能非常大,因此对数据的“按摩”相当密集。

我一直在阅读过去几个小时node.js是不是伟大的CPU任务和我见过的主要反应是产卵子进程(基本上是一个.js文件运行通过不同的节点实例),它处理可能会阻塞主事件循环的任何cpu密集型任务。

假设我有20,000个并发用户,那意味着它会产生20,000个OS级别的作业,因为它正在运行这些子进程。

这听起来像个好主意吗? (一个不同的web服务器只会在同一个进程上创建20,000个线程。)

我不确定我是否应该运行子进程。但我确实需要做一个非阻塞的cpu密集型任务。我应该做什么的想法?

回答

-2

那些说不知道如何构建解决方案的人。

NodeJS正是它所说的,它是一个节点,应该像这样对待。

在你的例子中,你的节点实例连接到一个外部api并抓取json来处理和发回。

即 1.使用// server.com/getJSON 2.处理JSON 3.后// server.com/postJSON

那么你会怎么做? 问自己是时间问题了吗?如果是这样,那么节点不是解决方案 但是,如果你对原始处理能力更感兴趣,而不是4秒内完成的一个请求

您有兴趣的是200秒内完成的请求,但每个人都需要约满10秒。

诊断您的JSON需要多长时间才能按摩,如果小于1秒。 只需运行4个节点实例,而不是1.

但是,如果它比这更复杂,请将json分成要处理的段。并使用异步回调处理每个段

process.nextTick(函数(doprocess(SEGMENT1); process.nextTick(函数(){doprocess(分段2)

每个doProcess调用下doProcess

节点JS将交易请求之间的时间。

现在采取这一解决方案,它的规模太大每个服务器4分节点的情况下,2-5服务器

,突然你有一个非常可扩展性和成本效益的搜索解决方案ñ。

+0

segmentize一个json文件,每个服务器创建4个节点实例,2-5个服务器?现在我有一个非常可扩展且经济高效的解决方案? gee whiz。 – foreyez

+0

比它看起来更简单。 2-5台服务器的吞吐量很大。多年以来,你从哪里来。 NodeJS的构建是为了像系统中的节点一样使用,它是完成任何你想做的事情所需的最低限度。这不是一种预先设定的可伸缩性解决方案,但是您可以使用它构建一个非常好的系统。 – miketheprogrammer

8

Power Node的V8 Javascript引擎实际上是pretty fast comparedto manyserver-side languages

问题是Node的Evented Model与cooperative multitasking非常相似 - 一个特定的请求操作将继续进行,直到它将控制权交还给Javascript事件循环为止,因此高CPU任务将阻止循环(意味着随机选择用户将获得完美的性能,而另一个组将获得超时,而不是性能随着负载的降级而降级)。

因此,对于CPU密集型任务,有几种解决方案,你可以使用:

  1. 你可以把你的代码像处理流水线,加工显著块之间根本process.nextTick降低平均延迟(同时增加绝对最小值),基本上更“合作”,并且不会让任何一个请求长时间占用CPU。
  2. 如果您的工作是纯Javascript(无需使用节点模块),则可以使用node-webworker-threads库将CPU密集型工作转移到线程。然而,不断产生新线程可能是一个糟糕的主意,所以你可能需要一个线程池,你排队工作,以便这些工作者从中拉出并返回到输出队列。在这种情况下...
  3. 您创建了一个子进程工作者池并使用相同的排队机制,其中池大小取决于需要CPU密集路径的请求的百分比,请求的总数以及可容忍的这些请求允许延迟增加。
相关问题