mongodb - 从数据库按时间间隔调度任务的最佳方法

标签 mongodb asynchronous cron redis scheduling

我有一个带有任务的 MongoDB 集合。每个任务都有一个以秒为单位的间隔、任务标识符和应通过 HTTP POST 发送的有效负载,以收集结果并将它们存储到另一个集合中。

可能有数千个具有不同间隔的任务,我不知道如何安排它们。

目前我正在使用每 10 毫秒按上次执行时间进行的简单轮询,但它会对数据库产生沉重的负载。

看起来像这样

mongo.MongoClient.connect(MONGO_URL, (err, db) ->
  handle_error(err)

  schedule = (collection) ->
collection.find({isEnabled:true, '$where': '((new Date()).getTime() - this.timestamp) > (this.checkInterval * 60 * 1000)'}).toArray((err, docs) ->
  handle_error(err)
  for i, doc of docs
    collection.update({_id: doc._id}, {'$set': {timestamp: (new Date()).getTime()}}, {w: 1})
        task = prepare(doc)
        request.post({url: url, formData: {task: JSON.stringify(prepare(doc))}}, (err,httpResponse,body) ->
          result = JSON.parse(body)
          console.log(result)
          db.collection(MONGO_COLLECTION_RESULTS).save({
        task: result.id,
        type: result.type,
        data: result
          })
        )

      setTimeout((() -> schedule(collection)), 10)
    )

  setTimeout((() -> schedule(db.collection(MONGO_COLLECTION_TASKS))), 10)
)

可以添加、更新、删除任务,我必须处理它。 使用redis怎么样?但我不知道如何在某些任务正在等待结果、间隔更改等时将数据从 mongo 同步到 redis

请建议最好的策略

最佳答案

我认为这不是解决您的用例的正确方法。

我建议不要将任务存储在任何数据库中,而是在任务进入时直接安排它们并保存结果,无论是否包含原始任务信息。

为什么不使用 Quartz安排任务?

关于mongodb - 从数据库按时间间隔调度任务的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32400699/

相关文章:

node.js - MongoDB - 错误 : document must have an _id before saving

python - 为什么 MySQL 驱动程序/客户端(例如 MySQLdb 或 mysqlclient 或 PyMySQL)即使在像 Tornado 这样的异步 Web 框架中使用时也会被视为阻塞?

c# - 哪种线程方法最适合主服务器网络?

java - 如何用响应式(Reactive)编程实现嵌套异步代码?

CakePHP:为什么我的缓存文件在过期时会导致巨大的峰值?

linux - 复制最近 14 天内修改过的文件

c# - 将数组插入 MongoDB 的子集合中会省略 _t 鉴别器

c++ - 如何为 Ubuntu 安装 MongoDB C++ 驱动程序?

javascript - JSON 更新对象内部的数组

node.js - 如何使用nodejs cron作业制作计划报告功能? (aws自动缩放问题)