节点child_process vs Heroku worker

试图让我的头脑围绕着Node和Heroku上的工作者线程。 从Node.js中调用exec会发生什么?

相信这是在单独的线程上运行,并且不阻止主事件循环是否正确?

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

如果在Heroku上,把这个移动到一个单独的工作者有什么好处吗? 例如

  • 如果计算密集,child_process会减慢主应用程序的速度吗?
  • 工人dynos得到自己的内存限制?
  • 一个未被捕获的错误(天堂禁止)不会崩溃的主要应用程序,如果在一个工人?

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

这对Heroku意味着,如果你使用child_process产生一个新的subprocess,你的Heroku child_process实际上可以做更多的CPU工作,因为它将会运行你的subprocess代码(很可能)单独的物理CPU(这是非常依赖于你的应用程序中的很多因素)。

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

例如,如果你的Dyno代码(web位,而不是一个单独的Heroku工人)正在做CPU密集型的东西,并使用child_process很多,你会用尽所有的CPU资源,你的代码将开始阻止/挂在节点。

一个更好的主意(尽pipe在Heroku上稍微昂贵一点)是把所有的工人/asynchronous代码放到一个独立的工人代码中,并且专门用来处理CPU密集型的东西。 这可以确保您的主网页dynos始终能够尽可能地快速响应。

我个人喜欢使用像Amazon SQS这样的排队服务来处理在我的网站dynos和我的工作人员dynos之间传递的数据,因为它速度超快,价格便宜,但是您有很多select。

你创build的每个dyno(web dynos和worker dynos)都有自己的资源,所以每个dyno都有自己的CPU和RAM。 可用的dynostypes和资源限制,并在这里解释: https : //devcenter.heroku.com/articles/dyno-types

关于error handling,如果你没有发现exception,说明会发生什么是很棘手的。 但是,您的整个Node应用程序很可能会崩溃(然后Heroku会重新启动它)。 这真的取决于你的具体实现各种事情= /