可靠性:幂等、重试与依赖
效果至少执行一次,所以写入要幂等;重试、暂停、依赖与链式上限,今天各怎么办。

本课目标
读完这一课,你将能够
- 说出「至少一次」执行意味着什么,并把一个写入改成幂等
- 说出组织级效果的重试与兜底,并区分应用工作流的暂停、补跑和依赖处理
- 判断一条自动化链会不会互相触发,说出链式上限与「不回头触发自己」
会重复,会失败:按最坏的情况设计
标准模型说得很直白:效果是「至少一次」执行,不是「恰好一次」。同一次触发,偶尔会让同一个效果跑两遍。所以要把写入设计成重跑无害,也就是幂等:同一个操作做一次和做很多次,结果一样。
办法有三:用固定的编号建记录;写之前先检查有没有做过;把数据模型设计成能容忍重复。
平台保证每条变化最多开一次运行,每个定时时刻只跑一次。手动运行带相同 Idempotency-Key 会得到同一次运行。工作流心跳超过 5 分钟未更新时,平台把状态设为 failed。重跑可能重复已完成的写入,必须靠幂等保护。
每次运行都用随机编号新建采购订单:一个物料一个晚上,可能出三张。
编号由物料和日期派生,如 PO-M-1042-2026-09-29:同一天重跑,第二次因主键已存在被拒绝,不会有第二张。
createObject(固定主键) | createOrModifyObject(固定主键) | |
|---|---|---|
| 第二次运行 | 主键已存在,被拒绝,已有数据不动,那一步报错 | 悄悄覆盖成同样的值,不报错 |
| 风险 | 运行记录里多一条失败,要看一眼 | 人改过的字段会被改回去,例如把已批准的单改回草稿 |
| 适合 | 只该建一次的记录:草稿、缺陷 | 「最新状态」类的写入:心跳时间 |
失败之后:重试、暂停与补跑
标准模型把失败分成两类:临时的(限流、外部服务出错、对象版本刚被别人改过),和配置错误。前者可以重试,后者要修好再重跑。重试有三层:单个效果的自动重试(固定间隔或指数退避,可加抖动);整次触发的事件重试(间隔小于 24 小时,次数 1 到 5 次);以及人手动重试失败的事件。
暂停、静音、过期是三个不同的开关。静音时条件照常评估、照常记录,只是不执行效果;暂停时定时与实时触发都不跑,但仍可手动运行;过期最长设六个月。最近 30 次事件里,只要有 80% 以上的事件所有效果都失败,就会自动静音。
| 标准模型 | AIDC 今天 | |
|---|---|---|
| 自动重试 | 单个效果与整次事件都可配 | 组织级 Action / Function 用 executionSettings.retryConfig.backoffStrategy 配固定间隔或指数退避重试,可加抖动。工作流步骤失败仍标记运行失败,已完成写入不回滚。 |
| 手动重试 | 选择失败的事件重跑 | 用同样的输入重新运行;「中断」的运行可以重跑 |
| 暂停、静音、过期 | 每个自动化各有开关 | 组织级可在 Automate 暂停。应用工作流没有单独的开关,可发布没有触发条件的版本。 |
| 自动暂停 | 失败率高或过于活跃时触发 | 本月计算分钟用完(缺省 2000):数据变化与定时都不再开跑,下月 1 日(UTC)恢复;错过的变化不会补跑 |
组织级效果重试耗尽后,用 fallbackEffects 处理失败对象,最多 5 个。应用工作流可用幂等写入和定时结果看门狗补充检查。看门狗查的是结果,例如「物料低于安全库存超过 4 小时,仍没有在途采购订单」。
错过的变化要补跑,就手动运行:每个对象一次,带一个稳定的幂等键。
# One manual run per object; the same key always returns the same run
aidc semantic automate run low-stock-po --param material_code=M-1042 --idempotency-key backfill-M-1042-2026-10-01
aidc semantic automate run low-stock-po --param material_code=M-2210 --idempotency-key backfill-M-2210-2026-10-01
依赖、链式与循环
标准模型的依赖,是让一个自动化在另一个(父)自动化完成后再评估,不管父的成败;只支持一层,父到子,不支持父到子到孙。两个自动化互相触发会形成循环,平台会检测并停掉实时自动化;确实需要时,最多允许 50 圈。
AIDC 没有单独的「依赖」设置,串联靠数据:工作流 A 写入一个对象,工作流 B 的 trigger.change 盯着它。三条规则:一条变化最多触发一次;工作流自己写出的变化不会触发自己;A 写的数据可以触发 B,触发链最多 3 层,再往下不再触发。
- 01数据写入ERP 同步一次检验结果
- 02工作流 ③写
defect并暂停工单 - 03另一个工作流盯着
defect,严重度为 critical 时升级通知 - 04封顶触发链最多 3 层,再往下不再触发
3 层上限是安全网,不是设计工具,到了上限它会静默停下。真正的办法,是让写出的对象类型不是触发它的类型,或者让效果把对象移出条件:② 写的是采购订单,不是物料,所以不会回头触发自己。
要点
- 效果「至少一次」执行,所以写入要幂等:用固定编号建记录,写之前先检查。
- 平台保证一条变化最多开一次运行;运行中途中断后重跑的重复写入,要靠你自己的幂等来挡。
- 组织级效果可配重试与
fallbackEffects;应用工作流仍需幂等写入、手动补跑和定时结果看门狗。 - AIDC 靠数据串联自动化,触发链最多 3 层,自己写出的变化不回头触发自己;3 层上限是安全网,不是设计工具。
- 计算分钟用完(缺省每月 2000)会让数据变化与定时都不再开跑,错过的变化不会补跑。
练一练
让写入可重跑,让失败被发现
三个练习,围绕 ② 的采购草稿。
把「每次触发用随机编号建采购订单」改成幂等:写出 create_purchase_order 那一步 with 里 po_no 的表达式,并说明同一天重跑时第二次会发生什么。
构想一个每 2 小时一次的看门狗:找出低于安全库存、却没有在途采购订单的物料,有就发邮件。写出它要用的查询能力、compute 的 filter,以及 dedupe 的取值。
假设本月计算分钟昨天用完、今天恢复。运行 aidc semantic sql 'SELECT "materialCode" FROM material WHERE "onHandQty" < "safetyStockQty"' 找出低于安全库存的物料,再写出补跑其中一个的命令(带稳定的幂等键)。
小测
选一个答案,马上看解析。
Q1物料 M-1042 的自动化在建采购订单时被中断,你手动重跑。怎样才不会多出一张订单?
Idempotency-Key 只保证相同的键得到同一次运行;新的键就是新的一次运行,照样会再写。幂等要落在写入本身。
Q2工作流 A 写入的对象会触发工作流 B,B 又写回 A 盯着的对象。会怎样?
「不回头触发自己」只管自己的写入,B 写的变化仍会触发 A。AIDC 目前还没有循环检测与自动暂停。
Q3本月计算分钟用完了,会发生什么?
两种触发都会停,恢复后也不回放积压,所以要补跑就手动运行。