我想知道,有没有办法实现背景任务,也许是工人池。你能告诉我方向吗,我正在考虑为此写包?
4 回答
2019 年更新
在考虑为任何东西编写一个包之前,首先看看是否有现有的包可以满足你的需要。在 Meteor 世界中,这意味着在 Atmosphere 上查找“工作/队列/任务/工人管理/调度”包,然后在 npm 上查找相同的搜索词。您还需要更准确地定义您的要求:
- 你想要持久性,还是内存解决方案有效?
- 您希望能够将作业分配到不同的机器上吗?
流星专用
- job-collection - 可靠(我在 2014 年在初创公司的生产中使用它),但目前处于维护模式。允许您安排在任何地方(服务器、客户端)运行的持久作业。
- SteveJobs - 由几个强大的 Meteor 工具的作者 Max Savin 积极维护
- littledata:synced-cron - “Meteor 的简单 cron 系统。它支持在多个进程之间同步作业。”
废弃的包裹:
- artwells:queue - 优先级、调度、日志记录、重新排队。由 MongoDB 支持的队列。最后一次代码提交:2015 年 10 月。
- 超级基本的 cron 包:easycron。最后更新:2015 年 12 月。
- 差异:工人- 产生无头工人流星进程来处理异步作业。最后一次代码提交:2015 年 1 月
- cron(自 2015 年起)
- PowerQueue -自 2014 年以来被放弃。排队异步任务,限制资源使用,重试失败。支持子队列。没有调度。没有测试,但漂亮的演示。由于使用递归调用,不适合长时间运行。
Npm 包
Meteor 已经能够直接使用 npm 包好几年了,所以这个问题相当于在 NPM 上寻找job/worker/queue 管理包。如果你不关心持久性:
- Async “提供了大约 70 个函数,其中包括通常的‘功能性’嫌疑人(
map
,reduce
,filter
,each
...)以及一些常见的异步控制流模式(parallel
,series
,waterfall
...)” - d3-queue - 极简主义,由 D3 作者 Mike Bostock 编写
如果您确实需要持久性,因为 Meteor 已经使用 MongoDB,使用具有持久性到 MongoDb 的作业调度包可能是有利的。最强大和最受欢迎的似乎是Agenda,但不幸的是它已经几个月没有维护了,而且它有大量积压的问题。
如果你愿意为你的项目添加一个由redis支持的依赖,还有更多的选择:
- Bull - 功能最全的 Node 作业队列解决方案,由 Redis 提供支持
- 蜜蜂- 简单、快速、健壮。不受Bull 展示的内存泄漏的影响
- Kue - Node 的优先级作业队列
和 MongoDB 一样,Redis 也可以提供高可用性(通过 Redis Sentinel),如果你想在多个工作机器之间分配作业,你可以将它们都指向同一个 Redis 服务器。
有一个基于 Cron 作业的包,可用于在特定时间间隔或日期安排任务。这是包:https ://atmosphere.meteor.com/package/cron
如果您碰巧查看了该软件包的来源,您会注意到它们只是在使用:
Meteor.setInterval( ... , delay );
因此,如果您将任务保存在数据库中,然后在启动期间将它们加载到间隔中,那么您可能会走上正确的轨道。
如果您正在寻找特定于 Meteor 的东西,我很高兴分享一个名为 Steve Jobs 的新软件包。它使运行后台作业就像调用方法一样简单。
它具有您期望的所有标准功能,例如只运行一次作业、重试失败的作业等等。您可以在 GitHub 上了解更多信息:
我猜他们的路线图上有适当的支持,但与此同时,我设法通过setInterval
. 请参阅cron-tick包。