【问题标题】:Best approach for scheduling tasks on interval basis from database从数据库按间隔调度任务的最佳方法
【发布时间】:2015-09-04 14:35:41
【问题描述】:

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

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

目前我正在使用每 10 毫秒最后一次执行时间的简单轮询,但它会在 DB 上产生沉重的负载。

它看起来像这样

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

请为此建议最佳策略

【问题讨论】:

    标签: mongodb asynchronous cron redis scheduling


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      解决数据库负载的一种方法是进行查询,以获取按顺序执行的任务,以及应在下一分钟左右执行的所有任务。然后你(希望)内存中的任务数量很少,并且可以为它们应该运行的时间设置 javascript 超时。如果要同时运行太多任务,那么一次从数据库中获取可能会出现问题。

      本质是将数据库中的几个任务批处理到内存中,并在那里处理一些调度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-14
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 2013-10-12
        • 2011-02-24
        • 2017-05-08
        • 1970-01-01
        相关资源
        最近更新 更多