工作流

最近更新时间: 2026-06-30 15:06:00

DAG 编排


TCT 中任务和工作流可以按照 DAG(Directed Acyclic Graph,有向无环图)的方式任意编排成工作流,并且支持以下功能:

节点类型

工作流中支持任务和工作流两种节点类型,即任务和工作流可以混合、嵌套进行编排。在工作流图中,任务和工作流节点使用不同的图标进行表示。

节点类型 图标
任务节点
工作流节点

下图的工作流中,我们包含了一个工作流节点。工作流可以这样进行多层嵌套,TCT 限制最多嵌套 5 层(不包含工作流节点的工作流嵌套深度为 1),一般建议嵌套深度不要超过 3 层。

用于构建工作流的节点,无论是任务节点还是工作流节点,触发方式必须选择为工作流触发,并且一个任务或者工作流只能被一个工作流使用,被工作流使用后不允许删除、不允许修改触发方式,删除工作流后才可以删除或者修改触发方式。

逻辑 AND/OR

如果一个任务有多个依赖,可以声明这些依赖关系是 AND(表示所有依赖任务必须满足)还是 OR(表示所有依赖任务只需满足一个) 方式,例如:

成功触发/失败触发

工作流中通过图中的边来声明依赖关系,依赖关系既可以是成功触发(以实线表示,依赖的任务执行成功后触发该任务),也可以是失败触发(以虚线表示,依赖的任务执行失败后触发该任务)。如下图所示,task1 执行成功则触发 task2,task1 执行失败则触发 task3。

关键任务

关键是工作流中必须要执行成功的任务,工作流中必须至少有一个关键任务,只有所有关键任务执行成功整个工作流才能算执行成功。例如上图中,只有 task2 执行成功了整个工作流的执行状态才能设置为成功。

触发规则

工作流的触发规则以及触发限制和任务里的一致,请参考前面任务的【触发规则】章节。

工作流执行

工作流触发后会按照编排好的依赖关系一步步向后执行,执行过程中我们可以查看任意任务节点的执行状态,以及任务的详细信息。

执行过程中,任务节点可能存在以下的状态:

任务执行状态说明
等待执行


下发中
执行中
执行成功
执行失败
执行超时
未执行,工作流执行已经结束,那些未被触发的任务,例如未达到触发条件的任务节点。
终止中,任务被手动终止,进入终止中状态。
已终止,被手动终止的任务进入已终止状态。
已跳过,任务失败后手动执行跳过的任务状态。
挂起,工作流中未开始执行的节点可以被挂起,挂起后工作流执行到该节点时会等待,直到该节点的挂起被解除。
暂停,只有在节点是子工作流时才支持暂停状态。
已拒绝,该节点配置了不允许并发执行,当该节点对应的任务或子工作流上一次执行还未结束时,重新触发执行会进入拒绝状态。
被限流,当系统达到性能瓶颈时,会对优先级为一般的任务进行限流,这样的节点触发后会概率性地被放弃调度执行,直接进入被限流状态。

工作流状态判定

状态 说明
执行中 执行中表示工作流尚未执行结束,可以是有节点尚在执行中,或者有节点被挂起等待,或者有可以触发的节点(触发条件满足)等待被触发执行。
成功 工作流被判定为执行成功,只需要工作流不在执行中,并且工作流中所有核心节点执行成功。
超时 工作流超时,表示整个工作流的执行时间超过了工作流上配置的超时时间,只有这一种情况下工作流才会被判定为超时状态。以下情况都不会判定为超时:
- 工作流只有一个任务节点,节点执行超时(超过任务自己的超时配置)进入超时状态,但是整个工作流执行没有超过工作流的超时时间。
已终止 只有手动停止整个工作流的执行,工作流才有可能进入已终止状态。即使工作流节点被单独停止进入已终止状态,整个工作流也不会进入已停止状态。
已拒绝 如果工作流不允许并发执行,工作流上一次执行尚未结束,新的触发会进入已拒绝状态。注意工作流节点因为并发限制进入了已拒绝状态,并不会导致整个工作流进入已拒绝状态,工作流进入已拒绝一定是工作流自身的并发控制。
失败 工作流执行结束,并且有核心节点没有执行成功,则工作流进入失败状态,这里并不需要去关心核心节点为什么没有执行成功(是依赖条件未满足没有触发,还是执行超时,亦或者被手动终止)。

重跑/停止

如果一个工作流处于执行中,我们可以在控制台上停止它,工作流停止后工作流批次状态会进入停止中状态,并且通知所有执行中任务节点执行停止操作,任务节点的停止请参照前文中任务的停止章节。所有任务都停止完成时(进入已终止状态)工作流批次状态进入已终止状态。

对于一个执行结束(成功、失败、超时、已终止都属于结束的状态)的工作流批次,我们可以在控制台重跑它,重跑时会采用和该任务批次(即执行记录)当时触发时相同的工作流详情版本进行触发。

触发重跑后会在该工作流批次下生成一个新的工作流批次流水,如下所示:

强制执行

工作流执行时,节点的触发要等到前置依赖的节点执行成功才能触发,如果节点是任务节点并且配置了允许触发的时间(如 20:00 之后)还需要等待触发时间到达才能触发。为了应对一些特殊的情况,TCT 也支持在工作流中强制一个节点开始执行,而忽略它的触发条件(如前置依赖、允许触发时间)。节点强制执行后同样会向后正常触发它后续的节点(但需要触发条件满足)。

状态标记

TCT 允许直接在工作流中将一个非终态(包括等待中、下发中、已挂起、执行中、暂停中、已暂停、终止中)的任务节点状态标记为某一个终态(如成功、失败、已终止、超时、未知),状态标记后会相应触发工作流中的后续节点。状态标记仅仅是在 TCT 中将任务标记为指定的状态,并不会去终止执行器上的任务(如果还在执行)。

注意:

标记任务批次的状态实际上是批量标记任务批次下的子任务的状态,而整个任务批次的状态还是通过子任务状态统计计算得到,因此会存在标记任务批次为某一个状态但是最终任务批次却是另一个状态的情况。例如对于个分片任务,假设有 100 个分片,我们设置任务成功判定条件为分片成功率大于 90%,假设这时候已经有 90 个分片执行成功,剩余 10 个还在执行中,我们尝试将它标记为超时,最终 10 个执行中的任务会是超时状态,但是任务批次整体的状态会是成功状态。

任务跳过/重试

如果一个工作流已经执行结束(成功、失败、超时、已终止都属于结束的状态),对于其中失败、已终止、超时、未知的任务,我们可以在控制台上执行重跑并继续当前工作流的执行,或者执行跳过并继续当前的工作流执行。

重跑并继续

执行重跑并继续,当前的任务节点会被重新执行,同时依赖它的所有后续任务节点也会重新进入等待执行的状态。
注意重跑并继续会对节点产生新的批次流水记录,但是整个工作流批次流水记录还是前的,这个和整个工作流批次的重跑不同。

警告:

重跑并继续表示的是从当前节点开始重跑后续的整个工作流分支,该操作会导致该节点后续已经执行过的节点(例如通过强制执行已经执行过的节点)重新执行,如果这个不符合业务场景需要请慎重使用该操作。如果想要仅仅重跑当前节点,而后续已经执行过的节点不再重新执行,请使用重跑节点功能。


跳过并继续

执行跳过并继续,会将当前的任务节点直接跳过(节点的运行状态被置为已跳过)并继续后续的任务,跳过的任务节点相当于执行成功,即使该节点是关键节点也不影响工作流最终的结果判断。

警告:

跳过并继续表示的是跳过当前节点并从当前节点开始重跑后续的整个工作流分支,该操作会导致该节点后续已经执行过的节点(例如通过强制执行已经执行过的节点)重新执行,如果这个不符合业务场景需要请慎重使用该操作。如果想要仅仅跳过当前节点,而后续已经执行过的节点不再重新执行,请使用重跑节点功能。


重跑节点

重跑节点仅仅重跑当前节点,而不会重跑该节点后续已经跑过的节点,该节点执行完成后会正常触发后续还没有执行过的节点。

跳过节点

跳过节点仅仅跳过当前节点,而不会重跑该节点后续已经跑过的节点,跳过该节点相当于该节点执行成功,会正常触发后续还没有执行过的节点。

暂停/继续

如果工作流处于执行中,我们可以将工作流暂停,注意暂停时如果一个任务节点已经开始执行,那么该任务节点会继续执行,待已经开始执行的任务节点执行完成后整个工作流将停止执行。
下图中,flow-task1 已经开始执行,此时如果暂停执行,工作流将会在 flow-task1 执行结束后进入等待状态。

对于暂停的工作流,可以继续执行。

如果某一个节点是工作流节点,那么我们也可以对执行中的该节点进行暂停、继续操作。

挂起/解除挂起

对于工作流中一个还未开始执行的节点,我们可以选择将其挂起,挂起后工作流执行到该节点时会停在该节点等待,直到手动解除挂起后该节点才会开始执行。

工作流删除

工作流删除和任务删除类似,删除有工作流进入删除中状态,删除中的工作流在 TCT 控制台上不可见。删除后工作流会被 GC(Garbage Collector,垃圾回收器)回收,和该工作流相关的历史版本,执行批次(包括流水),任务节点的执行批次(流水)等都会被回收。注意工作流中的任务节点不会被回收。

工作流节点搜索

在工作流执行记录中,我们可以通过节点状态或者节点名称来搜索图中的节点,搜索命中的节点会高亮显示并且自动缩放和移动画布来展示这些节点。状态搜索支持多选,节点名称搜索支持模糊匹配。