任务调度和实例执行方式

概要说明

概念说明

在任务开发场景中,离线任务都是周期性的运行(比如一天多次,一天一次等),除此之外,任务之间往往还会存在上下游的依赖关系,并按照依赖依次执行。像这种周期性的、有任务上下游依赖关系的就是调度的核心概念。

任务与实例

当用户在开发中,将一个开发脚本提交至生产环境后,即生成一个周期任务。一个周期任务每运行一次,就会生成一个周期实例,每个周期实例中可能会包含多次执行记录,例如自动重跑。

因此,周期任务与周期实例往往是一对多的关系。

调度系统的运作规则

调度系统的任务主要是两方面:生成实例按计划运行实例。具体概念如下:

生成实例

当任务提交到调度系统后,系统会根据调度配置的信息来生成实例。当前系统内提供两种生成实例的方式:

  • 次日生效:当日晚上22:00统一生成第二天的所有需要执行的实例。
  • 发布后立刻生效:即从用户点击提交后,系统会立即生成当天需要立即执行的实例。第二天的实例则按照系统默认的方式在晚上22:00统一生成。

具体生成规则,在调度属性配置「实例生成」中详细介绍。

按计划运行运行实例

每天按计划运行实例时,调度系统判断一个实例是否可以运行,一般情况下需要满足两个条件:

  • 任务是否到达了计划时间
  • 上游任务是否全部成功

若满足了以上两个条件,调度系统就会将该实例任务提交执行。当该实例任务获取到相应的资源后就会正常的如期执行实例运行

若不能满足以上两个条件,任务实例会处于未开始的状态。但是为了避免任务实例因为配置或上游暂停等情况导致大批量的任务实例长期处于未开始的状态,导致资源浪费。系统会基于用户配置的「调度等待时长」执行kill操作,即该任务实例会被系统直接判定为失败状态。

注意: 若生产环境中的周期任务未配置调度等待时长,则默认实例的调度等待时长为3天。即:当该任务到达了计划时间时,3天后无论上游任务是否全部成功,都会从未开始状态变更为失败状态。 若用户在调度配置中配置了「调度等待时长」,则待任务达到了计划时间时,无论上游任务是否全部成功,一旦超过了调度等待时长,任务实例状态均会从未开始状态变更为失败状态。

调度属性配置

在「开发」模块下,打开任意一个任务,点击调度配置功能,即可配置该任务的一系列调度属性信息。包括基础信息、调度时间、实例信息、调度依赖、任务产出等。

本文重点介绍调度时间、实例信息、调度依赖,其他内容可参考帮助文档

调度时间


调度周期:可配置调度周期、调度频次、开始调度时间、结束调度时间。当用户配置完这些信息后,系统会基于配置自动生成符合规则的标准cron表达式。自动生成该时间表达式会被调度引擎解析,通过时间轮算法推演出未来周期内所有符合条件的具体执行实例。

当前系统内的调度频次有分钟、小时、天三种。如果一个任务的Cron表达式在天以上的位置,比如周,月,年等区域,设置了取值为单一值或多值(而不是*)的,只要这些位置的取值不冲突,合法,那么不改变该任务的原有时间类型(不会变成周,月,年任务),只是约束了任务具体在哪些天跑,是这些天里的分钟,小时,天任务。(换句话说,其实没有周,月,年任务的概念)

例如:

  • 每个月1号,3号,一个任务在指定时间跑一次,那就是一个日任务,而不是月任务
  • 每周1,和周3这两天里,一个任务每隔两小时跑一次,那就是一个小时任务,而不是周任务,也不是天任务
  • 分钟任务类似,当任务的间隔是分钟级别的,那就是一个分钟任务。

生效日期:指当前调度任务的调度生效日期范围。支持用户选择永不结束或者指定日期。

永不结束即永久生效,目前系统是到2099年。

若用户指定了日期,那么当超出生效日期后,此调度任务的实例不会再生成。

实例信息

实例生成

实例生成:基于用户配置的调度配置信息和依赖关系按照用户选择的实例生成的规则生成相应的实例

发布后生效:从提交任务后立刻生效,具体实例变更/生成范围是:

  • 提交时间 早于 调度开始时间,以调度开始时间开始,更新/生成后续的实例
  • 提交时间 晚于 调度开始时间,那么自提交发布时间后,会更新/生成相应的实例
  • 历史已生成的不影响,仅从起始时间开始向后变更后续的实例。

次日生效:当日晚上22:00统一生成第二天的所有需要执行的实例:

实例重跑方式

产品内提供了三种重跑方式,主要会作用在以下两种场景的行为:

  • 实例运行失败后,是否由系统自动重跑。
  • 实例运行成功或失败后,是否运行用户在运维中心的实例运维列表下,点击重跑操作。

不同取值方式和行为定义如下:

  • 运行成功或失败,都可以重跑 :选择这种方式后,还需额外设置「实例自动重跑次数」和「实例重跑时间间隔」。选择该行为后,当实例运行失败时,系统会基于配置的重跑次数和间隔,依此触发自动重跑,一旦运行成功或到达重跑约定次数后,不再触发自动重跑的能力。同时可以在运维中心中找到该实例,无论该实例的状态时成功还是失败,均支持用户手动点击重跑操作,触发重跑行为。
  • 运行失败可以重跑,运行成功不可以重跑:具体行为同上,唯一区别在于。在运维中心操作时,若该实例的状态是成功的,则不允许点击重跑操作。
  • 运行成功或失败,都不可以重跑:选择该方式后,不会触发自动重跑行为,同时也不允许用户在运维中心点击重跑操作。

运行超时时长

当用户配置了运行超时时长时,若该任务实例运行时间超过设置的时间后会被强制kill,运行状态变更为失败。目的是当一个任务长时间处于「运行中」状态时,会导致资源的占用,通过设置“超时时间”,可以及时释放资源。

调度等待时长

配置调度等待时长后,当任务实例到达计划运行时间后,无论上游是否成功执行均会触发强制kill的行为。该配置主要用于上游任务因暂停导致大批量下游实例无法执行导致的资源浪费,建议谨慎配置。

调度依赖

调度依赖是指周期调度节点间的上下游依赖关系。通过节点的依赖关系有序调度运行上下游节点,即当上游节点运行成功后,下游节点才会启动运行,保障适时的产出有效业务数据。

更多调度依赖相关的实例执行行为见:任务调度依赖关系

运维操作

周期任务

  • 暂停:周期任务中状态是「正在调度」的可支持点击暂停。点击暂停后,自当前触发开始往后的所有实例任务均会被置为「暂停」。所有实例的概念包括:当天已生成的且未运行的实例,以及每天22点生成的第二天的所有实例。即虽然用户点击了暂停操作,但是仅是操作了实例的状态,并不阻塞该任务按期生成实例的行为。暂停行为仅是将该周期任务中的实例置为暂停状态,下游状态通常情况下会收到暂停的任务阻塞而导致无法运行。但是若下游任务配置了调度等待时长(或下游任务的自计划开始运行开始调度等待时长超过3天),那么下游任务会被强制kill。
  • 启动:周期任务中状态是「暂停调度」的可支持点击启动。点击启动后,当前周期任务中所有暂停的实例均会触发执行的行为。
  • 下线:周期任务直接下线后,在周期任务中不会进行任务管理,同时也不会再生成实例。若当前任务有下游任务正在运行,则不允许直接下线。需先将下游任务下线后,或点击下线(含下游)任务将当前任务即下游全部下线。
  • 补数:无论周期任务的状态是什么,均支持用户点击补数操作。用户触发补数行为后,会在补数任务中生成一个对应的补数任务。

实例运维

  • 重跑:只有执行结束的周期实例才可以操作重跑功能。且不同状态是否能重跑取决于用户在调度配置中的具体选项。若用户配置了 运行成功或失败,都不可以重跑,则也不允许点击重跑。用户在重跑操作上支持选择跑当前节点,或下游节点的能力。若用户有代码调整,并希望将某个节点按照最新代码重跑,则可以勾选使用最新代码和配置的能力,直接执行重跑操作。
  • 暂停:对于处于非暂停状态的任务实例才可操作。操作后,会把任务实例的调度属性设置为“暂停调度”,即不再调度运行该任务实例。
  • 恢复:对于处于暂停状态的任务实例才可操作。操作后,会把任务实例的调度属性恢复为“正常调度”,即按照设定的调度时间来运行任务实例。
  • 终止:对于运行中的任务实例才可以操作。操作后,会终止任务实例的运行、把任务实例状态置为失败。
  • 置成功:对于运行失败的任务实例才可以操作。操作后,强制将该任务实例置为成功。可用于紧急运维场景,在判断当前任务实例即使失败,也不影响下游任务的数据正确性的前提下,解除对下游任务实例运行的阻塞。
  • 置失败:对于运行成功的任务实例才可以操作。操作后,强制将该任务实例置为失败。

联系我们
预约咨询
微信咨询
电话咨询