用于cpu密集型任务的进程?

所以我开始为我正在做的项目使用node.js。

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

过去几个小时,我一直在阅读node.js如何对cpu任务不太好,我见过的主要响应是产生一个子进程(基本上是一个通过不同节点实例运行的.js文件)处理可能会阻止主事件循环的任何cpu密集型任务。

假设我拥有20,000个并发用户,这意味着它会在运行这些子进程时产生20000个os级别的作业。

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

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


与许多服务器端语言相比,支持Node的V8 Javascript引擎实际上非常快速。

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

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

  • 你可以像处理管道一样处理你的代码,并且简单地在显着的处理块之间处理process.nextTick以减少平均延迟(同时增加绝对最小值),基本上更“协作”,并且不会让任何请求花费CPU长时间。
  • 如果您的工作是纯Javascript(不需要Node模块),则可以使用node-webworker-threads库将CPU密集型工作卸载到线程。 然而,不断产生新线程可能是一个糟糕的主意,所以你可能需要一个线程池,你排队工作,以便这些工作者从中拉出并返回到输出队列。 在这种情况下...
  • 您创建一个子进程工作者池并使用相同的排队机制,其中池大小取决于需要CPU密集型路径的请求的百分比,请求的总数以及这些请求允许的容许延迟增加。

  • 那些说不懂如何构建解决方案的人。

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

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

    即1.获取// server.com/getJSON 2.处理json 3.发布// server.com/postJSON

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

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

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

    但是,如果它比这更复杂,请将json分成若干部分进行处理。 并使用异步回调来处理每个段

    process.nextTick(function(doprocess(segment1); process.nextTick(function(){doprocess(segment2)

    每个doProcess调用下一个doProcess

    节点js将在请求之间交换时间。

    现在,采用该解决方案并将其扩展到每个服务器4个节点实例,以及2到5台服务器

    突然之间你有一个非常可扩展的和成本效益的解决方案。

    链接地址: http://www.djcxy.com/p/52523.html

    上一篇: process for cpu intensive task?

    下一篇: Strange behavior in node.js