节点child_process vs Heroku worker

时间:2015-10-28 13:25:04

标签: node.js multithreading heroku child-process worker

试着让我了解一下在Node和Heroku上的工作者与线程。从Node.js中调用exec会发生什么?

认为这是在单独的线程上运行并且不阻止主事件循环是正确的吗?

    require('child_process').exec(cmd, function (err, stdout, stderr) {
      // ... do stuff          
    });

如果在Heroku上,将它移到一个单独的工人身上是否有优势? E.g。

  • 如果计算密集,那么child_process会使主应用程序变慢吗?
  • 工作人员是否有自己的记忆限制?
  • 如果在工作人员中,未被捕获的错误(天堂禁止)是否会导致主应用程序崩溃?

1 个答案:

答案 0 :(得分:2)

在Node中,子进程是CPU上一个真正独立的进程,它是父进程(Node.js脚本)的子进程。本文将更加深入地解释这一点:http://www.graemeboy.com/node-child-processes

这对Heroku来说意味着,如果你使用child_process来产生一个新的子进程,你的Heroku dyno实际上可以做更多的'CPU'工作,因为它将运行你的子进程代码(最有可能)在单独的物理CPU上(但这非常依赖于应用程序中的许多因素)。

然而,这可能是一个问题,因为每个Heroku dyno只有有限的CPU和RAM资源。

因此,例如,如果您的Dyno代码(Web位,而不是单独的Heroku工作者)正在执行CPU密集型操作并且大量使用child_process,那么您将耗尽所有CPU资源并且您的代码将启动阻止/挂起节点。

更好的想法(虽然在Heroku上略贵)是将所有工作/异步代码放入一个单独的工作器dyno,并使用该EXCLUSIVELY处理CPU密集型的东西。这样可以确保您的主要网络动态游戏尽可能快速响应。

我个人喜欢使用像Amazon SQS这样的排队服务来处理我的网络dynos和我的工作人员dynos之间的传递数据,因为它超级便宜,但你有很多选择。

你创造的每个dyno(web dynos和worker dynos)都有自己的资源,所以每个dyno都有自己设定的CPU和RAM。可用的dynos类型及其资源限制,并在此处说明:https://devcenter.heroku.com/articles/dyno-types

关于错误处理,如果你没有捕获异常,说出会发生什么是很棘手的。但是,您的整个Node应用程序很可能会崩溃(然后Heroku将重新启动它)。这实际上取决于你具体实现的各种事情= /