Node.js中的后台进程


96

有什么好的方法可以处理NodeJS应用程序中的后台进程?

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

在RoR中,我可以使用“延迟工作”之类的方法来完成。这个API的Node等效项是什么?


4
问题是现在所说的软件推荐,最终将被关闭。如果要用“此API的NodeJS等效项是什么?”代替最后一句话。它变得更具话题性。我想看到这个答案而不是封闭,因为我需要做类似的事情。
ssube

谢谢,改写它。
Ole Spaarmann

2
下面的好建议。还有ChildProcess可能有用的API。nodejs.org/api/child_process.html
lispHK01 2015年

stackoverflow.com/users/69349/ole-spaarmann-我很想知道您最终选择了什么,是否可以提供一个非常简单的示例说明如何将您的决策与NodeJS集成在一起-谢谢!
MLissCetrus

@MLissCetrus我选择学习Elixir,并且不再使用
NodeJS

Answers:


114

如果您想要轻巧的东西,并且与服务器运行的过程相同,我强烈建议Bull。它具有一个简单的API,可以对您的队列进行精细控制。

如果您正在寻找可以作为独立工作进程运行的程序,那么可以考虑使用Kue。它可以作为RESTful API服务器运行,甚至为它编写了多个前端应用程序。

如果您熟悉Ruby的Resque,那么有一个称为Node-resque的节点实现

Bull,Kue和Node-resque都由Redis支持,这在Node.js工作队列中无处不在。这三者都能做到RoR的DelayedJob所做的事情,这与您想要的特定功能以及您的API首选项有关。


3
这是一个很好的答案,但是提到ChildProcess API和webworker-threads模块可能会很棒。;)
ssube

@ssube我不同意你的看法。除非您的意思是创建一个查看队列以运行某些命令的fork,否则您是对的。向我+1。我正在使用Child_process,我的问题是我可以打开大量的进程,但是如果我有办法管理要在队列中运行的任务,那么我很高兴CP是一个很好的解决方案。可以做到这一点,但重点不是您自己做所有工作,而是重用经过战斗验证的代码(在这种情况下,类似Kue的代码可以完成您需要的所有魔术并允许api集成)。
dewwwald

Bull适用于PM2群集吗?还是您需要手动创建自己的集群(如其文档所示)?
Shayan Nahrvar,

31

后台作业与您的Web服务工作没有直接关系,因此它们不应处于同一过程中。随着扩展,后台作业的内存使用将影响Web服务性能。但是,如果需要,可以将它们放在同一代码存储库中,这更有意义。

如果时不时地丢弃一条消息,那么在两个进程之间进行消息传递的一个不错的选择是redis。如果您想“不留下任何消息”,则需要像Rabbit这样的重量级经纪人。您的Web服务流程可以发布,而后台作业流程可以预订。

无需将两个进程共同托管,它们可以位于单独的VM,Docker容器上,无论您使用什么。这样一来,您就可以轻松进行横向扩展。


3
真的是提到Rabbit的唯一答案吗?这是企业的答案。+1
Augie Gardner's

11

如果您使用的是MongoDB,建议您使用Agenda。这样,单独的Redis实例就不会运行,并且诸如调度,排队和Web UI之类的功能全部存在。 议程用户界面是可选的,当然可以单独运行。

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


3

我想建议使用Redis安排作业。它具有许多不同的数据结构,您始终可以选择一种更适合您的用例的数据结构。

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

对于工作者守护进程,我建议使用PM2。它得到了广泛的使用和积极维护。它解决了很多问题(例如,部署,监视,集群),因此请确保它不会对您造成太大影响。


1

我尝试了蜂队列公牛,最后选择了公牛。我首先选择了bee-queue b / c,这很简单,他们的例子很容易理解,而Bull的例子有点复杂。蜜蜂的维基蜜蜂队列的起源也引起了我的共鸣。但是蜜蜂的问题是<1>他们的问题解决时间很慢,他们的最新更新是10个月前。<2>我找不到暂停/取消工作的简单方法。

另一方面,Bull经常更新其代码,以响应问题。Node.js作业队列评估说,公牛的弱点是“问题解决时间慢”,但我的经验恰恰相反!

但是无论如何,它们的api是相似的,因此从一个切换到另一个很容易。


-6

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

我认为最强大且易于使用的是Sails.js

这是一个MVC框架,因此如果您习惯使用ROR开发,您会发现它非常简单!

如果您使用它,它已经提供了一个功能强大的(以javascript术语)作业管理器。

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

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


5
我正在寻找Node的后台进程管理器。根据定义,这应该与您的Web应用程序分开。无论您使用Sails,Express,Hapi还是任何您喜欢的东西都没有关系。
Ole Spaarmann

好的,您可以尝试Bull或Webworker-Threads ...祝您好运Node.js :)
Zio MakSò2015年

看起来sails.js很大,并且比cronJobs还要强大。我找到了node-cron(github.com/kelektiv/node-cron),我敢打赌这是sails.js所使用的。
pbatey '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.