长任务执行前,先锁定版本化策略快照
版本化策略上线时,如何让新计划采用新规则,同时保证执行中任务与重试继续按原快照得到可重复结果。
长任务通常由多个进程分段完成:控制器先创建运行计划,后续工作器生成产物,进程中断后还可能由另一个实例恢复。若每个阶段都重新读取可变的全局策略,同一次运行就可能被几套规则先后解释。
一次策略升级暴露了这个风险。新版增加了更严格的选题、元数据和展示要求,设计目标是只影响新建计划。回归测试却发现,部分历史夹具开始读到尚未对它们生效的新字段。旧计划没有变化,计划外部的解释规则已经移动。
处理方法是在创建计划时选择一次策略,把规范化后的策略快照写入计划,后续生成、审核、完成和恢复都只读取这份快照。新策略可以继续演进,执行中的任务仍能保持同一套判断依据。
先确认判断边界是否移动
策略内容是否合理只是其中一项检查。更早需要确认的是:同一运行经过一段时间或一次重试后,是否仍会得到相同决定。
脱敏证据覆盖了三代运行计划:
| 证据 | 结果 |
|---|---|
| 历史计划夹具 | 保留各自嵌入的 v2-v4 规则 |
| 新计划夹具 | 仅在生效边界后选择 v5 |
| 重试与恢复测试 | 继续使用原计划快照 |
| 校验器测试 | 按计划记录的版本选择对应 schema |
| 仓库验证 | 内容 QA、控制器、守卫、编译和安全检查通过 |
风险路径会在每个阶段按当前配置重新解析策略。重试时,旧内容计划与最新策略被拼在一起,形成两个相互冲突的身份。此前通过的产物可能突然失败;恢复过程也可能生成与原运行不同的结果。
在创建运行计划时选择策略
计划创建阶段拥有当时的运行日期、操作类型和可用策略版本,应由它完成唯一一次版本选择。选定后,计划同时保存版本号和所有会影响判断的规范化字段。
{
"run": "example",
"version": "v5",
"effective": "YYYY-MM-DD",
"snapshot": {
"min_score": 75,
"sources": [1, 1],
"evidence": [
"claims",
"mobile"
]
}
}
快照只保存决策所需输入,不包含凭据或无关配置。写入前还要统一默认值、字段顺序和可选字段表示,形成确定的序列化结果。后续证据便可以用哈希绑定到这份精确快照。
生效日期只决定新计划可以选择哪个版本,不能用于替换已有计划的策略。
所有阶段读取同一份快照
计划生成后,全局策略文件不再决定本次运行。生成、审核、完成、恢复和回读阶段都消费计划内的快照。
严格的控制器按以下顺序处理:
- 读取运行计划,要求
policy_version属于受支持版本。 - 使用该版本对应的 schema 校验内嵌快照。
- 重新计算快照身份,并与计划或检查点中的绑定值比较。
- 把同一份快照传给生成器与审核器。
- 快照缺失、格式错误或身份不一致时关闭写入,不回退到最新全局策略。
第五项封住了常见的兼容漏洞。回退到“当前配置”看似能让残缺历史计划继续运行,恢复结果却无法再证明原运行。
策略和校验器一起版本化
只保留旧 JSON 还不够。若校验器只理解最新 schema,历史计划仍会被新规则重新解释。校验入口需要显式按版本分派:
policy_version
|
+-- v2 -> validate_v2
+-- v3 -> validate_v3
+-- v4 -> validate_v4
+-- v5 -> validate_v5
每个版本定义当时存在的字段、默认值和不变量。公共检查可以复用,版本特有规则要保持可见。停用旧校验器前,也必须证明所有可恢复计划都已不再引用该版本。
测试同样需要分层。新版本用例证明前瞻行为;历史夹具证明旧计划身份没有漂移。缺少其中一层,策略上线都存在盲区。
验证策略切换过程
本次实现覆盖了以下边界:
- v5 只在激活点之后供新计划选择;
- 已锁定的 v2-v4 夹具保持原有行为;
- 控制器测试覆盖创建、完成、重试和恢复;
- 守卫测试阻断降低阈值、证据不足和伪造兼容结论;
- 内容 QA 测试确认新增的可见元数据与移动端证据进入哈希门禁;
- Python 编译、仓库安全扫描和差异格式检查通过;
- 受保护变更及其进入默认分支后的集成结果均通过 CI。
其中三组主要测试分别覆盖 112 项控制器用例、80 项内容 QA 用例和 44 项守卫用例。数量本身不能代替结论,这些用例的价值在于覆盖了状态跨阶段传递的位置。
适用边界
策略快照用于保持结果可重复,不能让已知危险规则长期存活。遇到安全或法律紧急禁令时,可以增加对所有版本生效的全局拒绝项。该例外需要范围明确,并与普通策略升级分开记录。
部分升级还需要迁移。迁移应创建新的计划身份,或生成一条说明字段变化与原因的修订记录。直接覆盖旧快照会破坏原决定与修订决定之间的证据链。
可复用的结论是:可变策略负责选择下一次运行,计划快照负责约束这次运行的完整生命周期。校验器随策略版本演进;快照绑定缺失时关闭写入;验证新规则的同时,也要持续验证仍需恢复的历史计划。
先说明系统,再说明症状
如果需要生产排障、DevOps 交付或物流系统集成协作,请提供当前表现、预期结果、受影响环境、可用日志或数据样例,以及发布限制。我会从现有证据开始判断。
通过邮件开始