feat: support durable task cancellation without foreign keys
This commit is contained in:
@@ -72,6 +72,7 @@ SDK 的 Run 每个实例只能调用一次,包括已经正常退出的实例
|
||||
## 4. 执行、续租与恢复
|
||||
|
||||
- 只有 Start 当前授权有效才调用处理器;同进程中的已知尝试最多调用一次。重复确认与重新连接只核对控制操作。
|
||||
- 自动 Worker 开启取消通知,收到匹配尝试的通知或 Resume/Start/Renew 返回取消意图后,立即取消处理器 context,原因是 ErrTaskCancellationRequested,停止续租并继续上报真实结果。该函数未返回前仍占本地物理槽。
|
||||
- 处理器在独立 goroutine 执行,网络控制由事件循环管理;每连接当前只保留一个执行器控制请求在途。不同处理器可以并行,控制请求顺序与业务并发上限分开。
|
||||
- 会话心跳按服务端 TTL 的三分之一计算,上限 5 秒。任务续租按当前保守租约剩余时间的三分之一安排,下限 20 毫秒;服务器仍限制总截止与单次尝试时限。
|
||||
- 每个处理器的租约监视器独立取消 context,断网或控制请求阻塞也不会延长本地执行权限。最新会话若缩短租约,监视器会采用较短期限。已到期的处理器不会被后续确认复活。
|
||||
@@ -91,12 +92,15 @@ Run 的重连恢复同一次控制操作。平台的 [安全重试](../api/retri
|
||||
| panic / runtime.Goexit | UNKNOWN / HANDLER_PANIC 或 HANDLER_ABORTED |
|
||||
| 非法 JSON、超限结果、不支持数值或嵌套 | UNKNOWN / INVALID_HANDLER_RESULT |
|
||||
| 处理器因租约取消返回错误 | UNKNOWN / LEASE_LOST |
|
||||
| 收到任务取消后返回 `&orbit.WorkerCancellationConfirmed{Details:...}` | CANCELLED;只用于确认本次停止且无未结清效果,历史未知效果仍需核查 |
|
||||
| 报告到达时租约已失效、或结果与权威状态冲突 | 服务端可只保存 EVIDENCE_ONLY;不把证据计为任务成功 |
|
||||
|
||||
原始异常和 panic 内容不写入结果或通知。Result/Details 最多 256 KiB,应优先使用对象引用。SDK 保留精确数字文本,并按服务端数字范围及完整帧的嵌套上限预检,避免产生永远无法接受的报告。
|
||||
|
||||
普通网络错误不能证明副作用未发生,因此不会自动解释为明确失败。UNKNOWN 由服务端结合真实幂等声明决定是否重试;迟到证据不能清除历史不确定效果。完整规则及可运行示例见 [安全重试](../api/retries.md)。
|
||||
|
||||
任务取消也不能自动解释为已停止。普通 ctx.Err() 仍报告 UNKNOWN;只有业务明确确认后才返回 WorkerCancellationConfirmed。已经成功时返回真实成功结果,不能因为 context 同时取消而覆盖成功。开始 ACK 丢失且处理器尚未调用时,SDK 重连核对意图后可以报告本次未执行;用法、升级顺序和完整示例见 [取消契约](../api/cancellation.md)。
|
||||
|
||||
## 6. 退出与故障边界
|
||||
|
||||
取消 Run context 后,运行器请求持久化排空,收集排空 ACK 之前已派发的工作,继续为在途任务续租并确认结果。进程应等待 Run 返回,而不是取消 context 后立即退出。
|
||||
|
||||
Reference in New Issue
Block a user