Background processes in Node.js

What is a good aproach to handle background processes in a NodeJS application?

Scenario: After a user posts something to an app I want to crunch the data, request additional data from external resources, etc. All of this is quite time consuming, so I want it out of the req/res loop. Ideal would be to just have a queue of jobs where you can quickly dump a job on and a daemon or task runner will always take the oldest one and process it.

In RoR I would have done it with something like Delayed Job. What is the Node equivalent of this API?

90923 次浏览

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

如果您正在寻找作为独立工作进程运行的程序,那么可以查看 Kue。它可以作为 RESTful API 服务器运行,甚至还有几个为其编写的前端应用程序。

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

Bull、 Kue 和 Node-resque 都支持 雷迪斯,它在 Node.js 工作者队列中随处可见。所有3个都可以做到 RoR 的 DelayedJob 所做的事情,这取决于您想要的特定特性以及您的 API 首选项。

后台作业与 Web 服务工作没有直接关系,因此它们不应该在同一个流程中。随着规模的扩大,后台作业的内存使用将影响 Web 服务的性能。但是如果愿意,您可以将它们放在相同的代码存储库中,任何更有意义的操作都可以。

如果偶尔删除一条消息是可以的,那么在两个进程之间进行消息传递的一个很好的选择就是 雷迪斯。如果你想“不留下任何信息”,你将需要一个更重量级的经纪人,如 兔子。Web 服务流程可以发布,后台作业流程可以订阅。

这两个进程没有必要共同托管,它们可以位于单独的 VM、 Docker 容器上,无论您使用什么。这使您可以毫不费力地扩大规模。

I suggest to use a proper Node.js framework to build you app.

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

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

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

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

如果您需要更多的信息,不要犹豫与我联系!

如果您正在使用 MongoDB,我建议使用 议程。这样,单独的 Redis 实例就不会运行,诸如调度、排队和 Web UI 等特性都会出现。Agenda UI是可选的,当然可以单独运行。

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

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

你提到了 RoR 和 DJ 所以我想你应该很熟悉 Sidkiq。如果愿意,可以使用 Node-sidkiq进行作业调度,但是它的 imo 不是最优的,因为它的主要目的是集成 nodejs 和 RoR。

对于将工人妖魔化,我建议使用 PM2。它被广泛使用并得到积极维护。它可以解决很多问题(比如部署、监控、集群) ,所以要确保它不会对你造成过度的伤害。

I tried 蜜蜂排队 & 扯淡 and chose bull in the end. 我首先选择蜂队列 b/c,它很简单,他们的例子很容易理解,而公牛的例子有点复杂。蜜蜂的维基 蜜蜂排队的起源也与我产生了共鸣。但是,蜜蜂的问题是 < 1 > 他们的问题解决时间相当慢,他们的最新更新是10个月前。我找不到一个简单的方法来暂停/取消工作。

Bull, on the other hand, frequently updates their codes, response to issues. Js 作业队列评估 said bull's weakness is "slow issues resolution time", but my experience is the opposite!

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