与 MongoDB 而不是 Redis 一起使用的 Kue 有啥好的替代品?
Posted
技术标签:
【中文标题】与 MongoDB 而不是 Redis 一起使用的 Kue 有啥好的替代品?【英文标题】:What is a good alternative to Kue that works with MongoDB instead of Redis?与 MongoDB 而不是 Redis 一起使用的 Kue 有什么好的替代品? 【发布时间】:2013-03-13 08:37:51 【问题描述】:我正在使用 node.js 和 mongodb 构建一个 Web 应用程序。 我需要添加延迟的工作。例如,在注册一个月后向用户发送一封电子邮件。 除了 Kue 之外,我还没有找到用于延迟作业的现有解决方案,但它使用 Redis,我更愿意在向我的 Web 应用程序添加另一个资源之前使用我现有的 Mongodb。
是否有任何现有的解决方案?
【问题讨论】:
【参考方案1】:简短的回答
简短的回答是否。没有 Kue 到 MongoDB 的端口,也没有任何计划。目前没有其他流行的开源项目提供类似的功能。此外,Redis 似乎更适合这类项目。
长答案
虽然 Kue 非常有趣并且提供的不仅仅是延迟任务,但您的要求似乎非常简单。
如果您只需要在注册一个月后向用户发送一封电子邮件,或者类似的事情,它通常内置在操作系统级别。
我建议你做的,假设你有一个sendEmail
方法(通常,你知道如何完成任务)如下:
-
根据操作系统,安排
sendEmailHandler
每天运行一次任务。在 Windows 中,这是使用 "Scheduled Tasks"
完成的,在 OS X、BSD 和 Linux 中,这是使用 cron
完成的。 (cron tutorial)。大多数 PaaS 选项也有这种选项(如 nodejitsu、Azure...)。
该任务应该是一个 node.js 脚本,它遍历一个长时间运行的任务列表(即每月、每周或更长运行一次的任务)。
在您选择使用的MongoDB
中,保存一组任务,每个任务都有一个“开始时间”。此类任务的一个示例是特定用户在 1 个月后收到电子邮件。
在您的 sendEmailHandler
脚本中,检查应该运行哪些任务并执行它们,然后您应该从 MongoDB collection
中删除它们。
虽然这听起来像是一些工作,但应该不会花太长时间。这里描述的所有代码都非常简单。
Kue 可以让你做一些事情,比如优先级、尝试、进度等,如果我理解正确的话,这些都是你不需要的。使用一个做很多事情来做一些简单事情的库最终可能会让你感到厌烦,因为调试和维护通常更难。
祝你好运!如果您希望我详细说明特定部分,请随时告诉我。
【讨论】:
感谢您的解释,但我正在寻找更具可扩展性的东西。注册后一个月发送电子邮件只是一个例子。我想创建在作业队列上工作、发送电子邮件、处理数据等的工作人员。所以,我正在寻找可以分发的东西,而不仅仅是在单个服务器上运行 我的建议不仅限于一台服务器,一台服务器每天都会触发作业,无论执行它的人都可能按照您的意愿进行分配(在 node.js 级别或MongoDB 级别)。如果您想要一个更直接的答案,那么否。 Kue 还不能在 MongoDB 上工作,也没有移植它的计划。目前没有任何项目可以提供与 MongoDB 类似的功能,老实说,Redis 似乎比 MongoDB 更适合此类任务。如果您愿意,我可以将其编辑到我的答案中。 这就是我正在寻找的更多答案。不过,我想知道为什么现在有 MongoDB 解决方案。我可以理解 Redis 在应尽快处理的任务队列(图像调整大小等)方面的优势,但延迟任务队列可能会增长得很快。 @Ita 很好。我已经更新了答案以适应您在问题中的意思。让我知道你的想法【参考方案2】:另一个选项是Agenda
Agenda 是 Node.js 的轻量级作业调度库。
【讨论】:
议程是否有队列(LiFo)?【参考方案3】:我只是在研究同样的东西,发现了这个 npm 包:
monq - MongoDB 支持的 Node.js 作业队列 - https://www.npmjs.org/package/monq
【讨论】:
【参考方案4】:我也在寻找这种与 MongoDB 一起使用的队列库。我刚刚找到mongodb-queue。
当需要处理大量消息和持久性时,Bull、Bee 或 Kue 等库是必不可少的。对于所有这些库,持久性都是通过 Redis 实现的。
【讨论】:
以上是关于与 MongoDB 而不是 Redis 一起使用的 Kue 有啥好的替代品?的主要内容,如果未能解决你的问题,请参考以下文章
如何将内存中的 MongoDB 与 Rails、Mongoid 和 Rspec 一起使用?