feat: support durable task cancellation without foreign keys

This commit is contained in:
2026-09-17 17:03:23 +08:00
parent 6805506450
commit 3ce7d2c104
48 changed files with 1642 additions and 164 deletions

View File

@@ -65,6 +65,7 @@ go run ./cmd/orbit-admin bootstrap \
| queue_id | 当前进程绑定队列 |
| capabilities | 1–32 个 handler / handler_version / payload_version 精确版本组合,不可重复 |
| capacity | 总执行槽数量,1–256,不是可用槽的累加值 |
| cancellation_notifications | 可选 bool,默认 false;true 接收 task.cancel 通知,自动 Worker 默认开启 |
重连必须保持凭据、队列、处理器集合和进程秘密,处理器集合的排列顺序不影响身份。新连接递增会话代次并使旧会话失效。知道 instance_id 或 task_id 不能接管执行。
@@ -90,7 +91,7 @@ capacity 使用单调递增序号和覆盖值。同序号同内容可重复,
| task.renew | AttemptRef | 只续期当前 RUNNING;新消息可续租,重复原消息只取回原回执 |
| task.finish | ref: AttemptRef、outcome、result、error_code、可选 retryable | 保存明确结果或未知效果;返回操作回执和当前授权 |
outcome 为 SUCCEEDED / FAILED / UNKNOWN。result 为非 null JSON 或证据引用。FAILED/UNKNOWN 必须带 1–64 字符的稳定 error_code;SUCCEEDED 不带错误分类。retryable 省略为 false,只有 FAILED 可设 true,表示此次明确失败可安全重试。FAILED/true 受次数与时限限制进入退避;UNKNOWN 仅在冻结策略为 IDEMPOTENT 且预算允许时自动恢复,其他情况转 NEEDS_REVIEW。历史不确定效果不会被后续失败覆盖;完整规则见 [安全重试](retries.md)。
outcome 为 SUCCEEDED / FAILED / UNKNOWN / CANCELLED。result 为非 null JSON 或证据引用。非成功结果必须带 1–64 字符的稳定 error_code;SUCCEEDED 不带错误分类。retryable 省略为 false,只有 FAILED 可设 true。CANCELLED 要求已保存取消意图且确认本次停止,不能用普通 context 错误推断;协议与升级顺序见 [取消契约](cancellation.md)。FAILED/true 受次数与时限限制进入退避;UNKNOWN 仅在冻结策略为 IDEMPOTENT、未取消且预算允许时自动恢复,其他情况转 NEEDS_REVIEW。历史不确定效果不会被后续失败或取消覆盖;完整规则见 [安全重试](retries.md)。
开始、续租和结束返回 CommandResult:
@@ -116,7 +117,7 @@ outcome 为 SUCCEEDED / FAILED / UNKNOWN。result 为非 null JSON 或证据引
receipt 是原操作的不可变确认;lease 是本次重新核验的执行权,两者不能混用:
- 只有 lease.active=true、lease.state=RUNNING,且仍在保守的本地有效期内,才允许处理器推进。LEASED 的 active 只表示预占有效。
- 只有 lease.active=true、lease.state=RUNNING、没有 cancel_requested_at,且仍在保守的本地有效期内,才允许处理器推进。LEASED 的 active 只表示预占有效。取消后的 active 可为 true,用于确认当前结果;不允许继续业务执行或延长期限。
- 原 start 回执可能仍表示 RUNNING,但当前 lease.active=false;旧 ACK 不能让已过期、已结束或已被替换的尝试复活。
- 有效期不超过租约窗口、会话期限、任务总截止和从 authorized_at 起计算的单次尝试时限。
- 客户端需要扣除请求总耗时及安全余量,用本地单调时钟停止执行,不能假定本地墙上时钟与数据库一致。
@@ -145,4 +146,4 @@ receipt 是原操作的不可变确认;lease 是本次重新核验的执行权
这些是有界的开发基线,不代表经过容量压测的生产参数。当前同队列操作使用较粗的行锁协调,吞吐与公平性需要 P6 按负载验证。服务退出会显式关闭被 HTTP Upgrade 接管的连接;断开不会直接撤销外部已发出的请求。
协议 Schema 和真实进程强杀恢复已通过回归,见 [P2 阶段验收](../reports/phase-2.md)。运行中取消属于 P3;凭据轮换、数据库故障切换、跨主机演练与容量验收属于后续生产验证。自动运行器对非协作处理器提供有界退出与状态报告,不能强制停止其外部副作用。
协议 Schema 和真实进程强杀恢复已通过回归,见 [P2 阶段验收](../reports/phase-2.md)。[运行中取消](cancellation.md) 已实现并通过回归;凭据轮换、数据库故障切换、跨主机演练与容量验收属于后续生产验证。自动运行器对非协作处理器提供有界退出与状态报告,不能强制停止其外部副作用。