Node Worker Threads与Heroku Workers比较

3

我正在尝试理解Node Worker Threads和Heroku Workers之间的区别,这与IT技术有关。我们的主API运行Express,只有一个Dyno。

如果我们需要处理大文件等密集任务,将单独使用一个worker Dyno是否有意义呢?

worker: npm run worker

我们处理的一些文件大小高达20mb,某些进程运行时间超过30秒的限制,因此在结果返回之前会断开连接。

那么,在工作程序中添加Node Worker Threads以创建子进程来处理请求是否可行?还是说Heroku worker本身就足够了?

2个回答

3
在深入研究并成功实现工作线程以解决原始问题后,以下是对于任何遇到相同情况的人的摘要。Node工作线程和Heroku工作进程类似,它们都旨在在Node中的单独线程上运行代码,而不会阻塞主线程。如何使用和实现它们因用例而异。

这是在NODE上创建集群环境的新方法。您可以遵循NODE文档创建工作程序,或者使用像microjob这样的东西来使为特定任务设置和运行单独的NODE线程变得更加容易。https://github.com/wilk/microjob。这很有效率,因为它们将在单独的工作线程上运行,从而防止I/O阻塞。

在Web进程上使用工作线程无法解决我的问题,因为当查询达到30秒时,Web进程仍然超时。重要区别:Heroku Workers不会!

这些是Heroku中单个应用程序内的单独虚拟Dyno容器。它们是独立的进程,没有Web进程运行的所有开销,例如http。工人不会听取HTTP请求。如果您正在使用NODE的Express,则需要一个Web进程来处理传入的http请求,然后再使用Worker处理作业。挑战是找出如何在Web和Worker进程之间进行通信。这是使用Redis和Bull Query一起存储数据并在进程之间发送消息来完成的。最后,Throng使使用Procfile创建集群环境变得更加容易,因此非常适合在Heroku上使用!

以下是一个完美的示例,其中包含了所有上述内容,Heroku提供了一个起始项目。https://devcenter.heroku.com/articles/node-redis-workers

谢谢!我也走过这条路...但有一个注意事项:必须使用Procfile来启动所有的进程。我试过只从Procfile中启动工作线程,从Package.json中启动服务器...但都没有成功。这是一个非常微妙的问题,花了很长时间才弄清楚。(前提是你没有使用Heroku的示例作为项目模板,并将这些内容整合到自己的项目中) - MLissCetrus
另外一件事……看看 Heroku Package.json 文件中的“start”……它使用了 foreman!(另一个注意点) - MLissCetrus
我在Procfile中有我的网站和工作进程,所以我没有遇到这个问题,谢谢你的补充。关于Foreman的观点很好。我还在努力弄清楚如何使用Foreman设置VS Code调试。请参阅我的问题:https://stackoverflow.com/questions/61591835/how-to-get-vs-code-debug-to-work-with-foreman-and-nf-start - AndyJamesN
安迪...我会发布我所拥有的东西以及我用来开始的过程...它并不优雅...但它可以帮助我进行调试...(在你的问题中) - MLissCetrus

1

然后,我会设置一个工作进程,像这样:worker: npm run worker参考:https://devcenter.heroku.com/articles/background-jobs-queueing 我不明白的是如何在我的Express API中让工作进程正常工作。假设一个端点需要执行一些密集的工作,我该如何确保工作进程处理它? - AndyJamesN
@AndyJamesN - 你最后解决了这个问题吗?如果是的话,能否发表一个答案...我也遇到了同样的情况,需要一些帮助。 - MLissCetrus
@MLissCetrus 是的,我回答了这个问题,并分享了我自己深入研究的经验。 - AndyJamesN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接