【问题标题】:Scheduling Jobs - Optimal Design调度作业 - 优化设计
【发布时间】:2011-09-03 05:20:19
【问题描述】:

我正在为以下用例寻找最佳设计。

我正在构建一个系统,用户可以在其中创建具有结束日期/时间的实体。一旦到达结束时间,我需要安排一个作业以将这些实体的状态更改为已过期。

这是我能想到的两种解决方案

  • 作业每分钟运行一次并运行查询以检查过期实体(endTime > sysdate)。 问题:在数据库上加载,每分钟运行一次此查询可能会给数据库带来负载。
  • 一旦创建实体,就为每个实体安排一个作业。 问题:系统中会创建太多作业,每天会创建 1000 个这样的实体。

还有比以上两个更好的解决方案吗?人们通常如何做到这一点?

【问题讨论】:

    标签: design-patterns quartz-scheduler job-scheduling


    【解决方案1】:

    每分钟查询一次并不是很重的负载。我有一个执行以下操作的 Windows 服务:

    管理 voip 会话的时间表,启动它们,结束它们,开始录制,结束录制,清除录制驱动器上的录制空间,显示 OSD 消息。这些任务中的每一个都在它们自己的带有计时器的线程中,并且大约每 4 秒运行一次查询。数据库中有超过 100,000 条记录,并且有 100 名 Web 应用程序的用户一次访问同一个数据库。它运行良好,已经使用了大约 3 年。

    根据您的框架,可能会有更好的选择,但我目前还没有找到。例如,.NET 有我还没有使用过的任务并行库,我听说这里有一些东西可以提供。无论如何,我多年来一直使用方法#1,它从来没有对我做错。

    当您考虑它时,即使是基于事件的系统也处于带有一些函数指针的循环中。问题是您是否手动管理它以及它是如何线程化的。 db 负载应该是微不足道的。

    【讨论】:

      【解决方案2】:

      我认为你可以结合两个想法。

      每小时运行一个获取数据的作业。 现在为每个仅在接下来 60 分钟内到期的对象创建作业。

      现在 60 分钟的时间只是示例.. 更改它以满足您的需要。

      【讨论】:

      • 谢谢 Gaurav,我最初是这么想的。但是,如果用户选择结束时间为 30 分钟,您还需要做其他事情。然后我们需要编写一些额外的逻辑来处理这些场景。
      猜你喜欢
      • 2013-09-15
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多