【国产】ETL任务调度运维平台 TASKCTL 作业互斥与强制依赖

89 阅读4分钟

互斥表示两个不同作业不能同时运行。作业互斥通过作业 ostr 属性实现。例如:

在上图中,两个作业 GetData1 与 GetData3 按串并关系,本来是可以同时运行的作业,但由于通过 ostr 属性设置相同互斥资源,从而使它们实现互斥并不能同时运行。

关于互斥资源的设置,主要通过一个自定义字符串来表示,只要名称相同, 就表示相关作业互斥。 作业之间的互斥不仅在相同模块中实现,也可以在不同模块甚至不同流程之间体现,只要资源名称相同即可。

实际上,在具体应用中,同一流程中距离相近的作业一般不会设置互斥,因为完全可以通过简单串并进行避免两个作业的同时运行,互斥更多的实际应用场景是在不同流程的作业之间实现互斥,这种距离遥远的作业,采用互斥属性更有实际意义。

另外,互斥只能对部署在同一调度服务器的流程生效,互斥资源名称的异同也是相对同一调度服务器而言。对于不同调度服务器之间的流程不会产生任何关系。

TASKCTL 的 goto 语句 – lean(强制依赖)

前面我们已经讲过,作业之间的先后关系依赖关系,主要通过串行组来实现, 但实际应用中,可能会发现两个需要依赖的作业很难通过串并组来实现。对于这种情况,我们可以通过强制依赖属性 lean 来实现。

以下是一段强制依赖设置的代码设计:

实际上,TASKCTL 强制依赖很类似一般程序语言中的 goto 语句,我们可以通过 goto 语句在程序内实现自由跳转。但同时我们也知道,一般情况下,语言设计思想都不建议使用或过多使用 goto 语句,而是尽量采用优良的逻辑设计去避免goto 的使用,以便保证程序的健壮性与可读性。

在TASKCTL 中也是同样的道理, 我们不建议用户使用 lean 属性,而是在流程设计时,多分析作业之间的关系,尽量采用串并条件分支等结构化的思路实现相应的功能,这样会使流程代码以及作业关系更清晰、更便于管理。

总之,我们要认识到,lean 要尽量少用或不用,它只是 TASKCTL 流程设计思想中结构化控制的。

执行计划控制策略

执行计划控制策略在调度应用中非常普遍,是调度控制策略中最重要的策略之一。执行计划指作业的运行周期,简单说,指一个作业什么时候需要运行,比如每周一、每月初、每月底以及季末等。

在TASKCTL 中,执行计划非常灵活,几乎可以定义任意周期,同时,TASKCTL可以分别支持自然日期执行计划与逻辑日期执行计划。技术上,主要通过 datetype 与 period 两个属性结合使用来完成灵活的执行计

datetype-日期类型

datetype 日期类型主要分自然日期与逻辑日期

  • **自然日期:**自然日期即系统日期,用 msystime 表示,datetype 缺省就为msystime,此时通常不需要用户再修改。

  • **逻辑日期:**一个流程中可以存在多个逻辑日期,它主要通过私有参数中以类型为 date 参数进行定义,比如一般常用的 workdate 参数。如果我们以逻辑日期确定执行计划时,datetype 设置为相应 date 类型的私有变量参数名称即可。

period-计划表达式

period 计划表达式主要是在 unix 系统的 Crontab 设计思想基础上进行改造,5.0 及以前增加了时间窗口特征,但从5.1 版本开始,taskctl 为了简化用户对 period 的使用难度,精简了时间窗口特征, 仅仅保留 [日] [月] [周]。

执行计划表达式格式与说明 [日] [月] [周]

整个表达式由三个字段组成,字段间通过空格分隔。

  • 日:*表示每日;0 表示月末;-1 表示不按日判断,而是由周决定

  • 月:*表示每月

  • 周:*表示每天;0-6 分别代码礼拜天到礼拜六

表达式例子

  • “* * *”: 表示每天可执行,缺省就是 * * *

  • “0 6,12 *”: 表示每年 6 月月末、12 月月末可执行

  • “-1 * 1,4”: 表示每周一、四可执行

  • “2,4-10 1,2 *”: 表示 1,2 月的 2 号以及 4 到 10 号可执行

执行计划应用案例

以下通过代码举例说明执行计划的应用:

例 1

以上计划按自然日期确定。表示每年 1、4、7、9 月,每 1、15 日可以执行。

例2

以上计划按逻辑日期workdate 参数日期确定。表示每年 1、4、7、9 月,每 1、15 日可以执行。