三种触发:数据一变、到点、有人点

第 4 课 · 共 7 课 约 7 分钟

怎么写触发条件、冷却和上限,什么事才配用定时。

本课目标

读完这一课,你将能够

  • 说出三种触发,并为一件事选对一种
  • 写出一个数据变化触发:类型、条件、冷却
  • 说出定时的四档频率,以及它们在部署时各自怎么处理

触发只写一处

在 AIDC 里,一件事什么时候开始,写在工作流清单的 trigger 里,只有三种:数据一变(change)、到点(schedule)、有人点(manual)。三种可以并存。

"trigger": {
  "manual": { "roles": ["developer", "member"], "preview": "members" },
  "change": { "type": "factory.stock", "when": "=object.qty < object.safety_qty", "cooldown": "12h", "input": { "sku": "=object.sku" } },
  "schedule": { "every": "1d", "at": "01:30" }
}

触发放在工作流里是有道理的:数据从哪来,是连接的事;存成什么,是语义层的事;「变成什么样时,做什么」才是流程。条件用工作流的表达式写,做的事就是它的步骤,运行记录、去重和链式上限也都在这里。触发和条件,全平台只有一份。

数据一变

语义层里某类对象新建或修改,且 when 条件为真时,触发一次。条件为假,不开跑,也不计分钟。上面的例子读作:库存低于安全值时触发,同一个物料 12 小时内只跑一次。

  • 冷却:cooldown 是同一个对象两次运行之间至少隔多久。告警类的工作流一定要写,否则同一个物料会反复提醒。
  • 同一批只开一次:input 留空表示「自己去查全部数据」。一次快照改了 100 个对象,只开一次运行,不跑 100 遍同样的检查。
  • 不回头:工作流自己写出的变化,不会回头触发自己;写出的数据可以再触发别的工作流,最多 3 层。

到点

只有「时间本身就是条件」的事,才按时间跑:日报,月底对账,以及「数据该来却没来」的看门狗。数据不来,就没有变化可以触发,只能靠时钟去问一句。看门狗常用表达式函数 hoursSince 判断数据多久没更新了。

等级部署时的处理
比每 5 分钟还密拒收部署失败:要实时,用数据变化触发
5 分钟到 1 小时高频一定告警,写明每月次数和预计的计算分钟
1 小时到 1 天中频提示每月次数
每天及以上正常每天一次是常态

所有定时都由平台已有的调度心跳执行,不会为每个工作流另装一个 cron;平台停过一阵,也不会把错过的时刻补跑一遍。

有人点,以及上限

第三种是有人点。manual 写明哪些角色能正式运行、谁只能预演。预演会真的读、真的算,只是不写;正式运行才把结果写进语义层。打开页面读一次也属于这一类:实时连接只在有人看时挂着,页面隐藏 1 分钟就自动断开。

三种触发受同一组上限约束:每个应用每月 2,000 计算分钟,用完后数据变化和定时都不再开跑,下月恢复;通知另有去重和冷却,每天最多 20 封。这些上限不是限制你,而是让一个写错的条件,停在账单出问题之前。

要点

  • 触发只有三种:数据一变、到点、有人点,全写在工作流的 trigger 里。
  • 数据变化触发用条件加冷却;输入留空时,同一批变化只开一次运行。
  • 定时只给「时间本身就是条件」的事,最典型的是「数据该来却没来」的看门狗。
  • 比每 5 分钟还密的定时拒收,5 分钟到 1 小时的一定告警,每天一次是常态。
  • 三种触发共用计算分钟等上限,用完即停,下月恢复。

练一练

把一个定时任务改成触发

拿第 1 课盘点里最频繁的那个任务。

用一句话写出它是为了什么:什么情况发生时,应该有什么结果。

小测

选一个答案,马上看解析。

Q1「每天早上汇总昨天的回款,发给财务」,最合适哪种触发?

Q2一次数据快照同时改了 200 个对象,input 留空的数据变化触发会怎样?

Q3想让一个工作流每 2 分钟跑一次,部署时会怎样?

延伸阅读