如何使用数据库服务器进行分布式作业调度?

时间:2009-11-14 11:49:16

标签: database parallel-processing distributed scheduled-tasks

我有大约100台电脑和几台工人。已连接到中央数据库以查询作业参数。

现在我必须为他们做好工作安排。一名工人的一份工作需要几分钟,不需要网络连接(交易工作和报告除外),可以随时以任何顺序完成。

约束:

  • 两次不接受任何工作
  • 如果工人死亡,将会有一段时间。

我以为我可以在DB中使用单独的表来安排工作。 如何创建和访问作业调度表?

2 个答案:

答案 0 :(得分:4)

将其分解成碎片:

你有一份工作描述 - 可能会对其执行的位置有一些限制 - 并且你有一个工作队列要执行,一般来说,如果没有其他限制你期望工作按顺序完成,即你从队列的前面拿走它们并将它们添加到最后。

如果我们将队列作为单个表运行,则作业将具有3种状态:

  • 未开始
  • 正在进行中
  • 已完成

因此,寻找要做的工作只是找到第一个工作(或者如果要批量分配工作的前n个工作),这些工作没有启动,然后将它们标记为已启动。如果约束比简单的前n个可用作业更复杂,那么它将成为满足约束的前n个可用作业,但它仍然应该相当简单。

这意味着队列表中的以下字段:

  • 状态
  • 排序的DateQueued(日期和时间)
  • Datestarted(日期和时间)超时
  • AssignedTo

应该添加一个DateCompleted - 但是如果工作是批处理的,那将不是严格准确的(它将是报告完成的时间)。

因此,对于工人(工人“app”),该过程变为:

  1. 连接到服务器
  2. 报告已完成的工作 - 设置状态和完成时间
  3. 申请新工作
    1. 搜索工作人员的新工作(工作人员可以开始的前n个工作)
    2. 将新工作分配给工人(设置状态,开始日期和分配到) - 搜索并指定为交易。
  4. 列出工作并断开连接
  5. 另外,您需要进程排队工作,查找已经“超时”的作业,以便可以重置状态并存档或以其他方式清除队列中已完成的作业。

    完整表格将包含以下所需的任何审核字段。

    • ID
    • JobID - 假设在其他地方定义了工作
    • StatusID
    • DateQueued
    • DateStarted
    • AssignedToID
    • DateCompleted

    希望有帮助...

答案 1 :(得分:0)

有趣的部分,以及所有困难所在的部分,都是在交易中包装起来的。

您需要两个表:可用工作表和正在进行的表记录工作。 “正在进行的工作”表具有工作表的唯一外键。

希望首先完成工作的流程会找到要完成的工作表中的一行。这应该使用随机排序顺序来完成,以减少争用。

该过程删除“正在进行的工作”行。它从未意味着在交易之外坚持下去。它只用于锁定。

然后该过程开始交易。

然后,该进程在“正在进行的工作”表中创建一行,其中一个外键引用正在进行的工作。然后它应该做的工作。作为完成这项工作的一部分,它应该改变正在处理的项目的状态(例如,使其“完成”并且不再可用于工作)。

提交交易的过程。

如果某个其他进程已经抓住了这项工作,那么该进程的事务将因为尝试将重复的外键提交到“正在进行的工作”表而失败。在这种情况下,该过程应该以一个短暂的随机间隔退回,并回到起点,试图找到一些工作要做。

仔细监控“正在进行的工作”表。某些数据库或某些数据库的某些版本不希望将这样的工作进度表用作队列,并且不断创建和删除行。具体来说,旧版本的Postgresql很难清理旧的,不再使用的行,导致表格膨胀和性能不佳。