跳到主要内容

让自动化无人值守地运行

你盯着跑的流程,和凌晨三点自己跑的流程,不是同一个流程。下面是放手之前要改的东西。

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 端到端测过一次

相关页面