可靠自动化设计
用状态机、门禁、幂等、重试和降级控制自动化风险。
数据源就绪检查
每次运行先检查权限、格式、日期和最少可用来源。定时触发不代表数据已经准备好。
| 情况 | 处理 |
|---|---|
| 临时超时 | 等待后有限重试,仍失败则标记缺失 |
| 认证失效 | 不重试,转人工重新授权 |
| 输入为空 | 按业务规则进入 Warning 或 Blocked |
| 字段变化 | 停止写入并告警,避免错列覆盖 |
| 数据超出规模 | 分批或转人工确认资源上限 |
扩量前的门禁
批量或并行不会修复不稳定流程,只会更快放大错误。开始扩量前必须同时满足:
- 小样已经用脱敏或合成材料覆盖标准、边界、失败和安全限制;
- 输入契约、证据字段和输出结构在本轮冻结;
- 输入、证据和输出使用明确的契约版本;
- 每个输入有稳定唯一编号,可以判断完成、失败和重复;
- 单项结果可以独立验收,失败项可以单独重试;
- 已设置单批规模、并发、成本、速率和总停止条件;
- 外部写入仍位于人工确认之后。
任一条件不满足时,返回建立可复用工作流继续小样验证,不进入批处理。
分离历史存量与未来增量
历史回填解决“已有一批数据怎样安全完成”,持续增量解决“以后只处理变化”。两者可以共享同一输入和证据契约,但不能共享含义模糊的进度状态。
| 维度 | 历史存量回填 | 持续增量处理 |
|---|---|---|
| 输入范围 | 冻结的完整清单 | 水位之后新增、修改或迟到的数据 |
| 批次标识 | 回填任务 + 分片编号 | 时间窗或变更版本 |
| 进度 | 每项 Pending、Running、Pass、Failed | 上次安全水位和本轮候选变更 |
| 重跑 | 只重跑失败或未完成项 | 重新计算受变更影响的项 |
| 删除 | 按回填清单解释缺失 | 先标记源删除,人工确认下游影响 |
| 结束 | 全部完成或失败队列已交接 | 持续运行,没有一次性“全部完成” |
两个流程的输出应遵守同一版本契约,才能合并到同一个索引、报告或知识库。契约升级时先暂停增量,完成兼容或迁移,再推进新水位。
历史回填:按清单分片
并行分片只复制已验证的处理契约。每个执行单元返回相同字段、来源定位、状态和错误,不允许自行改变总结方式。汇总阶段只合并通过校验的结果,失败项进入独立队列,不重跑全部输入。
持续增量:只处理变化
增量任务先读取轻量索引,使用稳定标识、修改版本或内容指纹找出候选变化,再按需要读取正文。水位只在本批输入和输出都完成后推进。
需要显式处理四类变化:
- 新增:创建新记录并加入索引;
- 修改:保留旧版本关系,重新计算受影响结果;
- 迟到:落在旧时间窗但本轮才出现,使用独立补录标识;
- 删除:先标记来源状态,不自动级联删除已发布或已审核产物。
水位不能只看任务启动时间
如果任务在处理中失败,而水位已经提前推进,下次运行会永久漏掉未完成输入。应在成功提交输出后推进安全水位,并为迟到数据保留回看窗口。
幂等与重复执行
每次运行生成唯一批次 ID,例如 weekly-report-sales-2026-W29。读取、生成和写入分别记录状态;重试时跳过已完成的写入,不重复发送消息或追加同一周报。
重试策略
- 只重试临时性错误,例如超时或明确的服务繁忙;
- 认证、权限、输入格式和业务规则错误不自动重试;
- 使用有限次数和递增等待,禁止无限循环;
- 重试耗尽后保留已生成产物并发送可行动告警。
断点续跑
记录批次、触发时间、已完成步骤、来源状态、输出位置、最后错误和更新时间。恢复时从失败步骤继续,不重复抓取和生成已经确认的产物。
降级交付
部分数据源失败时,可以交付简化结果,但必须在标题或顶部标注覆盖范围与缺失项。无法达到最低质量时,只交付失败说明和已有产物,不伪装成完整结果。
两阶段外部操作
发送消息、覆盖数据、提交表单和其他不可逆操作应放在第二阶段。
编排 Skill 可以决定走小样、回填还是增量路径,但不能绕过状态、质量和人工门禁。具体能力拆分参见技能与可复用经验。
上线前演练
- 全部来源正常;
- 一个来源超时;
- 所有来源为空;
- 认证失效;
- 推送目标不可达;
- 手动与定时重复触发;
- 输出超过规模或成本上限。
只有每种情况都有明确结果和恢复路径,才适合长期运行。