Node.js中的后台进程

在NodeJS应用程序中处理后台进程有什么好处?

情景 :用户向某个应用程序发布内容之后,我想紧缩数据,请求来自外部资源的附加数据等等。所有这些都非常耗时,所以我希望它不在req / res循环中。 理想的做法是只要有一个可以快速转储作业的作业队列,守护进程或任务运行者将始终采用最早的作业并对其进行处理。

在RoR中,我会用类似Delayed Job的方法做到这一点。 这个API的Node是什么?

如果你想要一些轻量级的东西,就像服务器一样运行,我强烈推荐Bull 。 它有一个简单的API,可以对队列进行细粒度的控制。

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

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

Bull,Kue和Node-resque全部由Redis提供支持, Redis在Node.js工作者队列中无处不在。 所有3个都能够完成RoR的DelayedJob所做的事情,这是你想要的特定function,以及你的API偏好。

后台作业与您的web服务工作没有直接关系,所以他们不应该在同一个过程中。 随着您向上扩展,后台作业的内存使用量将影响Web服务性能。 但是如果你愿意的话,你可以把它们放在同一个代码库中,不pipe什么更合理。

在两个进程之间进行消息传递的一个很好的select是redis ,如果每隔一段时间丢弃消息就可以。 如果你想“没有留下任何消息”,你需要一个像兔子这样更重量级的经纪人。 您的Web服务进程可以发布,您的后台作业进程可以订阅。

这两个进程不需要共同托pipe,它们可以位于不同的虚拟机,Docker容器,无论您使用什么。 这使您可以轻松扩展。

如果你使用的是MongoDB,我推荐Agenda 。 这样,单独的Redis实例就不会运行,并且所有function(例如计划,排队和Web UI)都将出现。 议程UI是可选的,当然可以单独运行。

也build议在你的应用程序逻辑和排队/调度系统之间build立一个松耦合的抽象,这样整个后台处理系统可以在需要的时候换出。 换句话说,为了使它们保持轻量级,请尽可能多的将应用程序/处理逻辑从日程工作定义中分离出来。

我想build议使用Redis来安排工作。 它有很多不同的数据结构,你可以随时select一个更适合你的用例。

你提到了RoR和DJ,所以我认为你对sidekiq很熟悉。 如果需要,可以使用node-sidekiq进行作业调度,但是由于它的主要目的是将nodejs与RoR集成,所以它可能不是最佳的imo。

对于工作者守护进程,我build议使用PM2 。 它被广泛使用和积极维护。 它解决了很多问题(例如部署,监视,集群),所以确保它不会对你有所帮助。

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

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

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

如果你使用它,它已经提供了一个强大的(以JavaScript的forms)作业经理。

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

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