Node.js中的后台进程

Background processes in Node.js

本文关键字:后台进程 js Node      更新时间:2023-09-26

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

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

在RoR中,我会用"延迟工作"之类的东西来完成它。这个API的节点等价物是什么?

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

如果您熟悉Ruby的Resque,那么有一个名为node Resque 的节点实现

Bull和Node resque都有Redis的支持,Redis在Node.js的工作队列中无处不在。他们将能够做RoR的DelayedJob所做的事情,这是你想要的特定功能和你的API偏好的问题。

后台作业与web服务工作没有直接关系,因此它们不应该在同一过程中。随着规模的扩大,后台作业的内存使用情况将影响web服务性能。但是,如果您愿意,您可以将它们放在同一个代码库中,无论什么更有意义。

如果可以偶尔删除一条消息,那么在两个进程之间传递消息的一个好选择是redis。如果你想"不留下任何消息",你需要一个像Rabbit这样的重量级经纪人。您的web服务流程可以发布,后台作业流程可以订阅。

这两个进程没有必要共同托管,它们可以位于单独的VM、Docker容器上,无论您使用什么。这使您可以在没有太多麻烦的情况下进行扩展。

如果您使用的是MongoDB,我推荐使用Agenda。这样一来,独立的Redis实例就不会运行,调度、排队和Web UI等功能都存在。议程UI是可选的,当然可以单独运行。

还建议在应用程序逻辑和排队/调度系统之间建立一个松散耦合的抽象,以便在需要时可以交换整个后台处理系统。换句话说,让应用程序/处理逻辑尽可能远离您的Agenda作业定义,以保持它们的轻量级。

我建议使用Redis来安排作业。它有很多不同的数据结构,你总是可以选择一个更适合你的用例。

你提到RoR和DJ,所以我想你对sidekiq很熟悉。如果愿意,可以使用node-sidkiq进行作业调度,但它的imo并不理想,因为它的主要目的是将nodejs与RoR集成。

对于工人守护程序,我建议使用PM2。它被广泛使用并积极维护。它解决了很多问题(例如部署、监控、集群),所以请确保它不会对您造成过度的影响。

我尝试了蜜蜂队列&公牛最终选择了公牛。我首先选择了bee队列b/c,它很简单,它们的例子很容易理解,而bull的例子有点复杂。bee的wiki bee Queue's Origin也引起了我的共鸣。但bee的问题是<1> 他们的问题解决时间相当慢,他们的最新更新是在10个月前<2> 我找不到一个简单的方法来暂停/取消工作。

另一方面,公牛经常更新他们的代码,以应对问题。Node.js的作业队列评估说公牛的弱点是"问题解决时间慢",但我的经验正好相反!

但无论如何,他们的api是相似的,所以从一个切换到另一个非常容易。

我建议使用适当的Node.js框架来构建应用程序。

我认为最强大和最容易使用的是Sails.js.

这是一个MVC框架,所以如果你习惯于在ROR中开发,你会发现它非常非常容易!

如果你使用它,它已经提供了一个强大的(用javascript术语来说)作业管理器。

new sails.cronJobs('0 01 01 * * 0', function () {
   sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");

如果您需要更多信息,请随时联系我!