在NodeJS应用程序中处理后台进程的好方法是什么?
场景:用户向应用发布内容后,我想要处理数据,从外部资源请求其他数据等等。所有这些都非常耗时,所以我想要它req / res循环。理想的情况是只需要一个可以快速转储作业的作业队列,守护进程或任务运行器将始终使用最旧的作业并进行处理。
在RoR中我会用延迟工作之类的东西来做。该API的Node等价物是什么?
答案 0 :(得分:89)
如果你想要一些轻量级的东西,它在与服务器相同的过程中运行,我强烈推荐Bull。它有一个简单的API,可以对您的队列进行细粒度控制。
如果您正在寻找作为独立工作流程运行的东西,也许请查看Kue。它可以作为RESTful API服务器运行,甚至还有几个为它编写的前端应用程序。
如果您熟悉Ruby的Resque,那么有一个名为Node-resque的节点实现
Bull,Kue和Node-resque都由Redis支持,这在Node.js工作队列中无处不在。所有3个人都可以做RoR的DelayedJob所做的事情,这是你想要的具体功能和你的API偏好。
答案 1 :(得分:24)
后台作业与您的Web服务工作没有直接关系,因此它们不应该在同一个进程中。在向上扩展时,后台作业的内存使用量将影响Web服务性能。但是如果你愿意的话,你可以把它们放在同一个代码库中,无论什么更有意义。
两个进程之间的消息传递的一个很好的选择是redis,如果每次都丢弃一条消息然后就可以了。如果你想要"没有留言"你需要一个更重量级的经纪人,比如Rabbit。您的Web服务进程可以发布,后台作业进程可以订阅。
这两个进程没有必要共同托管,它们可以位于不同的VM,Docker容器,无论您使用什么。这使您可以毫不费力地扩展。
答案 2 :(得分:9)
如果您使用的是MongoDB,我建议使用Agenda。这样,单独的Redis实例不会运行,并且调度,排队和Web UI等功能都存在。 Agenda UI是可选的,当然可以单独运行。
还建议在应用程序逻辑和排队/调度系统之间建立松散耦合的抽象,以便在需要时可以换出整个后台处理系统。换句话说,保持尽可能多的应用程序/处理逻辑远离您的Agenda作业定义,以保持它们的轻量级。
答案 3 :(得分:2)
我建议使用Redis来安排工作。它有许多不同的数据结构,您可以随时选择一个更适合您的用例。
你提到了RoR和DJ,所以我假设你熟悉sidekiq。如果您愿意,可以使用node-sidekiq进行作业调度,但是它的次优imo,因为它的主要目的是将nodejs与RoR集成。
对于工作人员守护,我建议使用PM2。它被广泛使用和积极维护。它解决了很多问题(例如部署,监控,群集),因此请确保它不会对您造成过大的伤害。
答案 4 :(得分:1)
我尝试了bee-queue和bull并最终选择了公牛。 我首先选择了bee-queue b / c,这很简单,它们的示例易于理解,而Bull的示例则有些复杂。蜜蜂的维基Bee Queue's Origin也引起了我的共鸣。但是蜜蜂的问题是<1>他们的问题解决时间很慢,他们的最新更新是10个月前。 <2>我找不到暂停/取消工作的简单方法。
另一方面,公牛经常更新其代码,以响应问题。 Node.js job queue evaluation说,公牛的弱点是“解决问题的时间缓慢”,但我的经验恰恰相反!但是无论如何,它们的api很相似,因此从一个切换到另一个很容易。
答案 5 :(得分:-4)
我建议使用正确的Node.js框架来构建你的应用程序。
我认为最强大且易于使用的是Sails.js。
它是一个MVC框架,所以如果你习惯在ROR中开发,你会发现它非常容易!
如果您使用它,它已经提供了一个强大的(以javascript术语)职位经理。
new sails.cronJobs('0 01 01 * * 0', function () {
sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");
如果您需要更多信息,请随时与我联系!