节点中的后台进程.js

在NodeJS应用程序中处理后台进程的好方法是什么?

场景:用户向应用发布内容后,我想处理数据、从外部资源请求其他数据等。所有这些都非常耗时,因此我希望它脱离req/res循环。理想的情况是,只需有一个作业队列,您可以在其中快速转储作业,守护程序或任务运行程序将始终采用最旧的作业并对其进行处理。

在RoR中,我会用类似Delay Job的东西来完成它。此 API 的节点等效项是什么?


答案 1

如果你想要一些轻量级的东西,在与服务器相同的进程中运行,我强烈推荐Bull。它有一个简单的API,允许对队列进行细粒度控制。

如果你正在寻找一些作为独立工作进程运行的东西,也许可以看看Kue。它可以作为RESTful API服务器运行,甚至可以为其编写多个前端应用程序。

如果你熟悉 Ruby 的 Resque,有一个叫做 Node-resque 的节点实现。

Bull,Kue和Node-resque都得到了Redis的支持,Redis在Node.js工作者队列中无处不在。所有3个都可以完成RoR的DelayEdJob所做的,这是你想要的特定功能以及你的API偏好的问题。


答案 2

后台作业与 Web 服务工作没有直接关系,因此它们不应位于同一进程中。纵向扩展时,后台作业的内存使用情况将影响 Web 服务性能。但是,如果需要,您可以将它们放在同一个代码存储库中,无论什么都更有意义。

在两个进程之间传递消息的一个不错的选择是 redis,如果时不时地删除一条消息是可以的。如果你想要“不留下任何信息”,你需要一个更重量级的经纪人,如Rabbit。Web 服务进程可以发布,后台作业进程可以订阅。

这两个进程不必共同托管,它们可以位于单独的 VM、Docker 容器以及您使用的任何内容上。这使您可以毫不费力地横向扩展。