节点 child_process 与 Heroku worker

Node child_process vs Heroku worker

试图让我了解 Node 和 Heroku 上的工作线程与线程。当您从 Node.js 中调用 exec 时会发生什么?

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

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

如果在 Heroku 上,将其移至单独的 worker 是否有优势?例如

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

这在 Heroku 上意味着,如果您使用 child_process 生成一个新的子进程,您的 Heroku dyno 实际上将能够完成 'more' 总共 CPU 的工作,因为它将 运行 您的子进程代码(最有可能)在单独的物理 CPU 上(但是,这在很大程度上取决于您的应用程序中的许多因素)。

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

因此,例如,如果您的 Dyno 代码(网络位,而不是单独的 Heroku worker)正在做 CPU 密集型工作并使用 child_process 很多,您将用完所有 CPU 资源,您的代码将开始在 Node 中阻塞/挂起。

一个更好的想法(尽管在 Heroku 上稍微贵一点)是将所有工作程序/异步代码放入一个单独的工作程序 dyno 中,并将其专门用于处理 CPU 密集的东西。这可确保您的主要网络测功机始终尽可能快速且响应迅速。

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

您创建的每个 dyno(网络 dyno 和 worker dyno)都有自己的资源,因此每个 dyno 都有自己设定的 CPU 和 RAM。可用的测功机类型及其资源限制,并在此处解释:https://devcenter.heroku.com/articles/dyno-types

关于错误处理,如果您不捕获异常,则很难说会发生什么。然而,您的整个 Node 应用程序很可能会崩溃(然后 Heroku 将重新启动它)。这真的取决于你对各种事情的具体实施=/