跳转到内容

工作流限制与快照

工作流编排有界的进程内执行,不持久化指令位置,也不在重启后恢复进行中的步骤。数据库队列不等于持久工作流检查点引擎。

控制默认、范围与边界
YAML 条目嵌套最大结构深度 16,不同于子工作流调用深度。
嵌套工作流调用调用深度计数最多 4;构建时拒绝静态循环,运行时再检查。根从 0 开始,深度 4 再调用会拒绝。
while/until max_iterations必填 1–1000,耗尽报错,不会截断后成功。
for_each max_concurrency默认 4,整数 1–16,位于 for_each 映射内。
parallel max_concurrency缺失允许所有已声明子项并行,显式整数 1–16,与 parallel 同级。限制子条目,不是全嵌套叶子的全局限制。
根 max_concurrent可选正 u32,限制符合条件的后台目标执行;项目/key 持久准入预算。
script retry times1–10 次额外重试,最多 11 次尝试,共享 deadline。
task 链部署深度通常 100,不是工作流嵌套深度;仅 Python/TypeScript 有 tasks API。

不能宣称 for_each 安全支持无限数据。引擎为解析后的输入建立迭代 future/结果数组;max_concurrency 限制活跃工作,不限制输入/结果内存。应用边界应限制数组和输出大小。嵌套 fan-out 会相乘,部署 worker/连接/资源上限可能低于 YAML 需求。

根 timeout 指定总预算,回退项目/部署默认(通常 30 秒),受连接/后台上限约束(通常 300/1800 秒)。步骤脚本自己的 timeout、子工作流声明的 timeout 均不会重置父 deadline。子调用继承剩余时间,秒级取整只是实现粒度,不是新的完整窗口。退避、信号量等待、资源请求和所有迭代共用预算。

通道按根声明预算,而非逐渐缩小的剩余时间选择。长工作流临近结束仍使用 long-run 语义。排队工作流整次持有一个准入的 long-run permit,其单次步骤和并行分支不会为每个子项递归再取 permit。非排队准入仍受部署通道限制,过载可使步骤失败。

根 max_concurrent/concurrency_key 用于符合条件的后台端点/tasks,不限制同步请求或普通测试/调度准入。缺 key 使用 workflow:<folder/name>,显式 key 与项目内脚本/工作流共享预算。相同 key 不会把不一致 limit 自动融合成新值,每次接受保留自身声明。非法/零限制可被忽略并在发布警告,不是禁用开关。

等待行保留冻结目标、输入、身份,可跨重启。不会保存 Authorization 凭证,caller_token 之后无法借用。仍有队列深度和通道上限。实例死亡时已运行的执行标记 interrupted,不会从最后完成步骤恢复/重试。外部效果、幂等与补偿仍由应用负责。

引擎在条目、重试尝试、循环迭代前检查取消,优先于超时。Continue/catch 不能吞掉取消。独立进程通道可终止当前进程;共享 worker、SQL 和不支持的路径可能先完成当前步骤。1.1.0 Rust 不可取消。保证是感知边界地停止,不是普遍立即打断或回滚。

Parallel/for_each 采用 fail-fast join:一个未处理错误会丢弃兄弟执行 future。已发送请求/写入仍可能完成,部分兄弟 end 日志可能缺失。不能因无结束行就认定未发生。脚本 catch/continue 可让子失败转成功,但不存在包装级重试/catch。并发部分副作用需显式对账。

端点发布冻结工作流定义、各步骤脚本主体和递归嵌套定义。编辑实时行会影响直接 test/schedule,但公共调用保持快照直到重发。回滚恢复冻结定义/源码,不回滚外部数据库或实时资源。

**1.1.0 重要例外:**工作流步骤 uses 模块每次执行前实时解析,包含所有嵌套步骤。它不同于普通脚本端点冻结的非 live 图,不会持久化进工作流快照。编辑共享模块可在不重发时改变已发布工作流,回滚也不恢复模块。显式 (live)、直接草稿/调度和无冻结模块元数据的旧脚本快照也实时解析。脚本依赖说明区别。

资源按步骤/依赖文件夹和当前资源数据解析,YAML 不是通用秘密快照。优先 broker,不把认证投影序列化进输出。步骤继承 principal/request,嵌套不增加权限。Raw-body 工作流端点的 $inputs 只有路径/查询参数,脚本步骤从 request 上下文读原始正文。

先用概览无资源用例,在隔离项目加入有界并发和有意失败,检查结果顺序、每次尝试日志,编辑后比较草稿与发布调用。嵌套日志路径为 sub.inner、sub[0].inner,step_index 不是全局唯一,需结合 iteration/attempt/path。重跑是可能重复副作用的新执行,不是检查点恢复。

没有原生 approval、wait-event、持久 sleep/checkpoint 或 external-job 适配器。不要用无限循环伪装长等待;必要时明确设计 task/schedule 并在应用保存状态。本文只提供手工用例,没有执行真实取消/重启/副作用验证。