对持久 Workflow 进行版本管理
保持 Definition Identity 稳定,部署兼容 Worker,拒绝未知 Checkpoint Schema,并避免重新解释历史。
版本为何是运行时状态
持久 Task 可能在数周后由另一进程恢复。Checkpoint 指明生成它的 Workflow Definition 与 Schema。改变 Step 顺序、Branch Identity、Wait 含义、Input Shape 或恢复策略,都会改变旧 状态的意义。
因此 Version 属于执行 Identity,而不是 Release 装饰。
Definition Identity
使用稳定 Workflow Name 加显式 Version。Step ID 与 Branch ID 是持久数据,不能从源码行号 或展示 Label 派生。注册所有 Active Task 可能需要的 Definition。
在获取外部权限前拒绝缺失或不匹配 Definition。不要让旧 Checkpoint 静默通过最新 Graph。
部署策略
安全选项包括同时运行新旧 Worker Pool、一个 Worker 注册多个 Version、Cutover 前 Drain 旧 Version,或只让新 Task 使用新 Version 而旧 Task 原样完成。
用 Deployment Admission 控制新工作进入哪个 Version。按 Version 监控 Active 与 Waiting Task 数,但不要把高基数 Task Identity 放入 Metric。
Checkpoint 迁移
如果旧代码可以继续服务,优先不迁移。必须迁移时,定义从精确 Source Schema 到精确 Target Schema 的类型化转换,并验证 Tenant、Workflow Identity、Phase、Branch Membership、Usage 与 Effect Evidence。
Migration 必须幂等、对 Active Worker 带 Fencing、可审计,并使用生产形态 Fixture 测试。 不支持的历史要明确失败。
退役检查
删除 Version 前,证明不存在 Queued、Leased、Waiting 或可恢复 Task;没有 MCP Task Route 指向它;没有 Timer 或 Signal 能唤醒它;满足 Retention 与 Legal Hold;承诺支持的旧 Checkpoint Fixture 仍有覆盖;Rollback 不再需要旧 Binary。
发布期间同时注册两个版本
let v1 = Workflow::builder("order-review")
.version(1)
.step("review", ReviewV1, CapabilitySet::new())
.build()?;
let v2 = Workflow::builder("order-review")
.version(2)
.step("review", ReviewV2, CapabilitySet::new())
.step("audit", WriteAudit, audit_capabilities)
.build()?;
let mut registry = WorkflowRegistry::new();
registry.register(WorkflowDefinition::new(
Arc::new(v1), v1_budget, v1_capabilities,
))?;
registry.register(WorkflowDefinition::new(
Arc::new(v2), v2_budget, v2_capabilities,
))?;只把新 Task 路由到版本 2,同时让 Worker 继续恢复版本 1。按 Definition Version 统计
Queued、Leased、Waiting 与 Recoverable Task。只有所有计数为零且没有外部 Route 能创建
或唤醒版本 1 时才能移除。缺失定义会产生 DefinitionUnavailable,绝不能静默替换成
最新版本。