Mongodb 从数据库按时间间隔安排任务的最佳方法

Mongodb 从数据库按时间间隔安排任务的最佳方法,mongodb,asynchronous,cron,redis,scheduling,Mongodb,Asynchronous,Cron,Redis,Scheduling,我有一个包含任务的MongoDB集合。每个任务都有一个以秒为单位的间隔、任务标识符和有效负载,应该通过HTTP POST发送以收集结果并将其存储到另一个集合中 它可能有数千个不同时间间隔的任务,我不知道如何安排它们 目前,我使用的是每10ms执行一次的简单轮询,但它会给数据库带来很大的负载 看起来是这样的 mongo.MongoClient.connect(MONGO_URL, (err, db) -> handle_error(err) schedule = (collecti

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

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

目前,我使用的是每10ms执行一次的简单轮询,但它会给数据库带来很大的负载

看起来是这样的

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


请给出最佳策略的建议

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

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


为什么不使用调度任务?

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

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


为什么不使用来计划任务?

如果您知道要运行的任务,可以使用unix
crontab
进行计划,它运行连接到DB或发送HTTP请求的脚本

如果每个任务都是唯一的,并且您不能以这种方式预先安排它们,那么您可能可以使用当前的数据库集合,但不能经常轮询数据库

如果在正确的时间执行任务并不重要,我可能会每隔10秒执行一次db查找,以查看自上次查找以来应该执行哪些任务

解决db负载的一种方法是进行查询,以获取应在何时执行的任务,以及应在下一分钟左右执行的所有任务。然后(希望)内存中的任务量很低,并且可以设置javascript超时,以确定何时应该运行这些任务。如果同时运行太多的任务,那么一次从数据库中获取可能会有问题


其实质是将数据库中的多个任务批处理到内存中,并在内存中处理一些调度。

如果您知道要运行的任务,可以使用unix
crontab
进行调度,它运行连接到数据库的脚本或发送HTTP请求

如果每个任务都是唯一的,并且您不能以这种方式预先安排它们,那么您可能可以使用当前的数据库集合,但不能经常轮询数据库

如果在正确的时间执行任务并不重要,我可能会每隔10秒执行一次db查找,以查看自上次查找以来应该执行哪些任务

解决db负载的一种方法是进行查询,以获取应在何时执行的任务,以及应在下一分钟左右执行的所有任务。然后(希望)内存中的任务量很低,并且可以设置javascript超时,以确定何时应该运行这些任务。如果同时运行太多的任务,那么一次从数据库中获取可能会有问题

其本质是将多个任务从数据库批处理到内存中,并在内存中处理一些调度