让自动化无人值守地运行
你盯着跑的流程,和凌晨三点自己跑的流程,不是同一个流程。下面是放手之前要改的东 西。
1. 让每个结局都明确
无人值守的运行没法问你问题,所以每条路径都必须结束在一个有意为之的地方。在给任何东西排计划之前:
- 接好你在意的每一个失败端口。没接线的 route 会让运行以
TRANSITION_NOT_FOUND死掉——见错误码。 - 给每个 Stop 写上消息。那条消息就是日志里出现的东西,而日志是你早上唯一能拿到的。
"Not on a known screen after 2 BACK presses"告诉你发生了什么;一个节点 id 不会。 - 跑 Validate。一个编写期的错误留到凌晨三点才暴露,代价是你的一整晚。
2. 把护栏抬到匹配真实负载
默认值是保护一个你盯着的流程。一次长时间无人值守的运行会撞上它们。
| 护栏 | 为什么它半夜会触发 | 该设成什么 |
|---|---|---|
| Max node executions | 循环会成倍放大——12 个节点跑 200 轮约 2400 次执行 | 加循环时就有意识地抬高,而不是等一次运行死掉之后 |
| 运行时长上限 | 一个长批次单纯就是比有人看着的测试更久 | 抬高它,或者把工作拆开 |
| 连续失败次数 | 一个服务挂了,看起来就像动作节点反复失败 | 这一个保持严格——正是它阻止一次坏掉的运行烧掉整夜 |
见执行模型了解每一个护栏保护什么。
3. 在正事前面放一道前置条件
不要让流程自己去判断今天该不该跑。用计划任务的 Check Flow:一个在主流程之前运行的小流程,由它决定主流程该不该跑。
| 检查失败时 | 行为 |
|---|---|
| Skip, retry next time | 跳过本周期,下次冷却后再试 |
| Stop this schedule | 禁用该计划任务,直到你重新启用 |
优先选 Skip-retry,除非检查失败真的意味着有东西坏了。
让检查保持极小
Check Flow 每个周期都跑,在主流程之前。一个耗时 30 秒的检查,即使通过,每周期也要花掉 30 秒。
4. 设一个损害半径
这是大家会跳过的一步。两个上限,都在计划任务上:
- Limit runs per day —— 一个硬性的每日预算。凡是触及真实服务的都要设。进度会在仪表盘上显示成
4/8 today,撞上限的流程显示 Daily Limit Reached(不是错误)。 - Only run within hours —— 把触发约束在一个时间窗内,这样失控的东西不会在正午开跑。
5. 给间隔留出呼吸的空间
在实例忙碌时触发的计划任务会被跳过,而且没有补跑。十个错过的每小时触发,不会在实例空闲时变成十次运行。
所以间隔必须长于一次运行,还要有余量:
间隔 > 最坏情况的运行时长 + 沉降时间
如果你的流程在糟糕的一天要跑 8 分钟,那 10 分钟的间隔 会一辈子都在报 Skipped (busy)。设成 20。
如果每个周期都真的重要,那就把间隔拉长,而不是心存希望——这个设计是有意丢掉错过的触发,而不是堆出一批陈旧的活。
6. 睡前先把时区弄对
每个计划任务带自己的时区,你输入的时间是在那个时区里的。Summary 面板会以四种方式预览解析出的时刻——计划任务时区、你的本地时间、UTC,以及是否适用夏令时。
保存前读一遍那个预览。有夏令时的时区里,每日 08:00 每年会相对 UTC 漂移两次,否则"十一月它提前一小时跑了"就成了一个谜。
7. 决定跑什么,以及按什么顺序
队列是一个序列,不是一个并行批:
- 按依赖排序。 如果流程 B 假定流程 A 把应用留在某个界面,它们必须相邻且顺序正确。
- 用
afterPreviousSuccess让这个依赖成为真实的,而不是暗示的。否则第一个流程坏了,第二个照跑。 - 勾选不等于顺序。 未勾选的流程仍在队列里、保留位置、并被静默跳过——这正是临时搁置一个流程的正确方式。
记住:一个实例一次跑一个流程。并发来自更多实例,每个实例有自己的队列。
8. 给早上的自己留点能读的东西
- 每个结局上的 Stop 消息(第 1 步)。那就是你的日志。
- 保留队列的终结历史——每一项的
success/failed/skipped,是计划任务行为异常时你的证据。 - 不要开着 Run Evidence。它每个动作写一张图;跑一整夜就是一个巨大的目录。只在复现某个具体问题时才开——见排查一次失败的运行。
起飞前检查清单
- Validate 通过,没有阻塞问题
- 你在意的每条失败 route 都接好了
- 每个 Stop 都带消息
- Max node executions 已抬高到能装下循环
- Check Flow 已设置,而且很小
- 已设 Limit runs per day
- 间隔从容地长于最坏情况的运行时长
- 读过 Summary 预览,理解夏令时
- 队列按依赖排序,该用
afterPreviousSuccess的地方用了 - Run Evidence 关闭
- 至少用 Test Flow 端到端测过一次
相关页面
- 计划任务 —— 重复方式、冷却、上限、Check Flow
- Flow Queue —— 运行模式与按项的输入值
- 执行模型 —— 护栏保护什么
- 第 12 课 · 综合实战 —— 一个为排计划而建的流程