节点工作线程与 Heroku 工作线程

Node Worker Threads vs Heroku Workers

我正在尝试了解节点工作线程与 Heroku 工作线程之间的区别。

我们的主要 API 运行ning Express 有一个 Dyno。

为我们的密集型任务(例如处理大文件)配备一个单独的 worker Dyno 是否有意义。

worker: npm run worker

我们处理的一些文件最大为 20mb,一些进程花费的时间超过 30 秒的限制 运行,因此在连接恢复之前终止连接。

然后我可以在工作程序应用程序中添加节点工作线程来创建子进程来处理请求,还是 Heroku 工作程序本身就足够了?

您保留一个测功机并将其放大可能更有意义,这意味着多个实例将 运行 并行。

https://devcenter.heroku.com/articles/scaling

在更深入地研究这个问题并成功实施工作人员解决原始问题后,这里是遇到相同情况的任何人的总结。

Node 工作线程和 Heroku 工作线程的相似之处在于它们打算 运行 在 Node 中不阻塞主线程的单独线程上编写代码。您如何使用和实施它们取决于用例。

节点工作线程

这些是在 NODE 上创建集群环境的新方法。您可以按照 NODE 文档来创建工作人员或使用类似 microjob 的东西来使其更容易设置和 运行 为特定任务分离 NODE 线程。

https://github.com/wilk/microjob

这很好用,而且效率会更高,因为它们会 运行 在单独的工作线程上防止 I/O 阻塞。

在 Web 进程上使用 Heroku 上的工作线程并没有解决我的问题,因为 Web 进程在查询命中 30 秒后仍然超时。

重要区别:Heroku Workers 不要!

Heroku 工人

这些是单个应用程序中 Heroku 上的独立虚拟 Dyno 容器。它们是独立的进程,运行 没有 Web 进程 运行 的所有开销,例如 http.

Worker 不监听 HTTP 请求。如果您将 Express 与 NODE 一起使用,则需要一个 Web 进程来处理传入的 http 请求,然后需要一个 Worker 来处理这些作业。

挑战在于如何在网络和工作进程之间进行通信。这是通过结合使用 Redis 和 Bull Query 来存储数据和在进程之间发送消息来完成的。

最后,Throng 可以更轻松地使用 Procfile 创建集群环境,因此非常适合与 Heroku 一起使用!

这是一个在 Heroku 提供的入门项目中实现上述所有内容的完美示例。

https://devcenter.heroku.com/articles/node-redis-workers