【问题标题】:How perform task with dependencies and scheduling如何执行具有依赖关系和调度的任务
【发布时间】:2012-08-08 06:45:15
【问题描述】:

我有一个必须安排的任务列表,例如 cron。这是用于 sql server 上的备份。

数据库将以多种组合方式执行 FULL、DIFF、LOGS 备份。

所以:

  • 每天早上 8:00 满员
  • 每小时不同
  • 每 10 分钟记录一次

但是,我有这个问题:

  • 如果服务器在上午 8:15 醒来,则不会执行 FULL 任务。
  • 如果 FULL 失败,则执行 DIFF & LOG 没有意义
  • 如果服务器在星期六早上 8:15 醒来,LOG 开始 8:20 启动,那么完整必须等待下周一。
  • 如果 LOG 占用太多(未在上午 9:01 完成),则 DIFF 在 LOG 尚未完成时开始。我不想那样!

我使用quartz.net 执行此操作,但这是切线的-我愿意更改库,删除它等等-。所以我的主要目标是任务顺序/执行的可靠性。

在顺序代码中,这很容易做到:

  • DO_FULL 那么
  • DO_DIFF 那么
  • DO_LOG

但是,使用调度程序这是不可能的(至少使用石英)。

问题在于时间的管理。当任务被标记为每小时开始时,必须更多的是提示而不是硬规则,因为前一个可能没有完成。另外,做 FULL 是开始循环的必要条件。

我不知道这里必须应用算法。

【问题讨论】:

    标签: c# .net sql-server scheduled-tasks database-backups


    【解决方案1】:

    最简单的解决方案是编写一个 Windows 服务(按照设计,它可以连续运行)。

    1. Windows 服务在 8:00 唤醒其线程之一 (T0)。
    2. T0 执行必要的验证并在验证失败时发出警报并中止,否则生成完整的备份线程 T1。
    3. T1 仅在所有验证都正常时才会执行,因此请继续备份。
    4. 如果 T1 成功完成,服务将唤醒其差异线程 (T2) 和日志线程 (T3)。
    5. T2 和 T3 检查 T1 的最后一次成功运行。如果 T1 失败,T2 和 T3 也会中止。
    6. T2 每小时执行一次,执行 diff 并休眠。
    7. T3 每 15 分钟执行一次。它必须检查 T2 是否正在运行,如果是,则再次休眠(x 秒)并重试。如果 T2 不运行 T3,则应履行其职责。
    8. 在一天结束的某个预定时间,如果需要,所有线程都应重置或中止。

    【讨论】:

      【解决方案2】:

      您需要跟踪执行的任务。例如,要运行 DIFF,必须先执行 FULL。为此,请启动任务并将 FULL 的状态设置为 false。当 FULL 完成其工作时,将状态设置为 true。当 DIFF 有时间运行时,它会检查 FULL 是否准备好(基于 FULL 生成的真或假值)。如果不是,则 DIFF 只是等待,直到 FULL 发送它已完成其工作的信号(真)。 LOG 运行也是如此。这是实现顺序行为的一种简单方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 2011-04-14
        • 1970-01-01
        • 2020-05-20
        • 2015-06-18
        • 2018-07-07
        相关资源
        最近更新 更多