Node.js中的后台进程
Background processes in Node.js
在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");
如果您需要更多信息,请随时联系我!
- JS页面在后台加载时显示动画
- 事件循环的MEAN.JS setInterval进程(从另一个服务器获取数据)
- 不同进程之间共享Node.js环境
- 如何通过子进程连接Java应用程序后在node.js中编写文件
- jar文件的后台进程,如何在进程结束时异步通知我
- 需要了解后台|node.js
- Chrome 打包应用 - 消息从后台传递.js传递到另一个脚本页面
- 如何在后台HTML5 / JS中下载视频
- 后台 PHP/JS 中的 HTTP 身份验证
- 在后台进程中发送电子邮件
- 后台页面 JS 代码在弹出控制台中的日志记录不同
- AngularJS:后台进程
- 如何在Javascript中创建后台进程
- PHP后台进程类似于Nodejs
- 在node.js中使用工作/后台进程vs .异步调用
- 在后台通过JS加载和解析URL
- Node.js中的后台进程
- 使用Node.JS运行后台进程
- 如何在我的谷歌浏览器扩展程序中将信息从后台传递.js到自动填充.js
- 如何管理与后台进程相结合的模块实例