feat: trace task sources to fixed workflow activations and rounds
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Weave 流程编排功能与设计
|
||||
|
||||
> 版本 0.10 · 2026-09-18。首版功能范围已确认。定义结构、发布校验与不可变版本已实现,见[定义格式](api/workflow-definition-format.md)和[发布API](api/workflow-definitions.md);[实例受理](11-workflow-admission.md)、[结果消费与根推进](12-workflow-runtime.md)、[TIMER与POLL时钟](13-workflow-clock.md)已接入。[信号等待及最终查询竞争](14-workflow-signals.md)已接入内部运行器;[暂停/继续/取消与停止结清](15-workflow-controls.md)已实现内部链路;[人工核查与TASK恢复](16-workflow-recovery.md)已接入内部服务;[POLL跨激活恢复](17-workflow-poll-recovery.md)和[等待恢复](18-workflow-wait-recovery.md)已接入;[实例公共API/SDK](api/workflows.md)已接入;完整历史、来源及生产验收仍需交付。
|
||||
> 版本 0.10 · 2026-09-18。首版功能范围已确认。定义结构、发布校验与不可变版本已实现,见[定义格式](api/workflow-definition-format.md)和[发布API](api/workflow-definitions.md);[实例受理](11-workflow-admission.md)、[结果消费与根推进](12-workflow-runtime.md)、[TIMER与POLL时钟](13-workflow-clock.md)已接入。[信号等待及最终查询竞争](14-workflow-signals.md)已接入内部运行器;[暂停/继续/取消与停止结清](15-workflow-controls.md)已实现内部链路;[人工核查与TASK恢复](16-workflow-recovery.md)已接入内部服务;[POLL跨激活恢复](17-workflow-poll-recovery.md)和[等待恢复](18-workflow-wait-recovery.md)已接入;[实例公共API/SDK](api/workflows.md)已接入;流程任务来源已接入;完整历史及生产验收仍需交付。
|
||||
|
||||
## 1. 职责与边界
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ HTTP/SDK创建时间范围使用包含下界、不包含上界;v2游标以固
|
||||
|
||||
### 任务直接来源视图
|
||||
|
||||
[来源查询](api/task-source.md)复用Task.OwnerKind/OwnerID/RetryOf、Schedule、ScheduleVersion与ScheduleOccurrence,沿已有(namespace_id,task_id)唯一索引及计划版本键定位,不增加表、持久化字段、索引或迁移。只读响应模型的每个字段也有中文注释。任务、计划、触发版本与队列归属在认证事务中显式验证,缺失关联不被默认为普通任务;流程来源随Weave实现。
|
||||
[来源查询](api/task-source.md)复用Task.OwnerKind/OwnerID/RetryOf、Schedule、ScheduleVersion与ScheduleOccurrence,沿已有(namespace_id,task_id)唯一索引及计划版本键定位,不增加表、持久化字段、索引或迁移。只读响应模型的每个字段也有中文注释。任务、计划、触发版本与队列归属在认证事务中显式验证,缺失关联不被默认为普通任务;流程来源已实现,见本页末尾。
|
||||
|
||||
### 业务事务Outbox示例模型
|
||||
|
||||
@@ -222,3 +222,7 @@ PollState新增FirstRound和FirstRoundAttemptsUsed,记录当前激活的首个
|
||||
### 等待恢复与PENDING接续
|
||||
|
||||
复用现有激活、等待、查询状态和不可变审计,不新增迁移或字段。RearmWait以新代次保留首次等待截止;ContinuePoll保留当前代次和原轮次,以权威已处理结果及管理审计恢复间隔。仍为35个实体/305个中文注释字段,无外键,见[等待恢复](18-workflow-wait-recovery.md)。
|
||||
|
||||
## 流程任务直接来源
|
||||
|
||||
[WORKFLOW来源](api/task-source.md#5-流程固定来源)复用实例固定版本、步骤、激活、查询轮次及Task.RetryOf;不增加迁移、表、持久化字段或外键。响应模型和独立SDK新增字段均有中文注释,仍为35个持久化实体/305个直接字段声明。沿已有任务唯一索引和步骤代次唯一键核验正反向归属,只返回直接父任务;人工恢复不改写旧任务的历史激活来源。
|
||||
|
||||
@@ -28,30 +28,30 @@
|
||||
| P1 任务受理闭环 | 应用凭据与作用域权限、队列、幂等提交、查询、待执行取消、受理事件;SDK 客户端 | API/SDK 创建查询闭环;重复键与内容冲突、响应未确认重报、跨命名空间拒绝、参数边界 | 已完成并通过阶段回归(见 P1 报告;真实断路/提交 ACK 丢失注入留后续故障阶段) |
|
||||
| P2 Worker 执行闭环 | WSS 接入、能力/容量、领取与开始、租约、续租、结果确认、排空与恢复;Worker SDK | 真 Worker 执行;失联/重连/重复确认/旧尝试拒绝;业务效果未知转核查;节点故障接管 | 已完成并通过阶段回归:服务端、自动 SDK、历史查询、完整 Schema 与真实进程强杀恢复;测试拓扑和剩余生产故障矩阵见 P2 验收报告 |
|
||||
| P3 Pulse 完整能力 | 安全重试、延时、Cron/固定间隔、漏跑策略、计划版本、运行中取消、并发许可、配额/背压、可靠结果订阅、批量受理、独立任务核查/人工重试、查询筛选与事务Outbox接入 | 多实例领取/触发竞争、重试上限、取消竞争、队列隔离、积压恢复、事件重复交付 | 已完成平台功能阶段验收:[原范围逐项核对](reports/phase-3.md)、[本轮完整回归](reports/phase-3-delay-recovery.md)。补齐相对延迟、改参数关联示例和四种重试全停恢复场景;20个可运行示例全部通过。全平台生产门槛及SDK首版交付剩余项仍按P6–P7推进 |
|
||||
| P4 Weave 主流程 | SDK 定义构建与发布校验、实例、顺序/分支/结构化并行汇合、信号/定时等待、版本绑定 | 重启接续、早到/重复信号、并行竞争、内部事件重放、发布版本兼容;端到端通用流程 | 定义格式/词法类型校验、不可变发布、独立SDK及六类节点定义例子已实现,已通过[子项验收](reports/phase-4-definitions.md);已补[有限决策器及内部结果交付](reports/phase-4-engine-core.md);[实例受理及首批事务](reports/phase-4-admission.md)已实现;[结果消费和根接续](reports/phase-4-runtime.md)已接入后台,顺序/分支/并行及真实进程恢复已验证;[TIMER与后续POLL轮次](13-workflow-clock.md)已接入;[信号消费和最终查询竞争](14-workflow-signals.md)已接入内部运行器;[内部控制与停止结清](15-workflow-controls.md)已接入;[内部核查与TASK新激活](16-workflow-recovery.md)已接入;等待恢复已接入内部服务;实例公共API/SDK与基础可运行场景已接入;完整历史、来源与更多场景继续开发 |
|
||||
| P5 Weave 恢复与查询 | 有界查询、暂停继续、取消、人工核查恢复、控制门控与审计 | 轮次与尝试独立预算;暂停/开始/回执/超时竞争;恢复保留预算;未知结果不盲目重复 | 有界查询轮次/尝试独立预算及原截止恢复已接入内部运行器;最终信号竞争及在途查询结清已接入;内部暂停/继续/取消与失败结清已接入;执行核查、步骤结论、解除核查及TASK新激活已接入;[POLL跨激活恢复](17-workflow-poll-recovery.md)已接入;等待恢复已接入内部服务;公共API/SDK已接入;完整历史、来源与更多场景继续开发 |
|
||||
| P4 Weave 主流程 | SDK 定义构建与发布校验、实例、顺序/分支/结构化并行汇合、信号/定时等待、版本绑定 | 重启接续、早到/重复信号、并行竞争、内部事件重放、发布版本兼容;端到端通用流程 | 定义格式/词法类型校验、不可变发布、独立SDK及六类节点定义例子已实现,已通过[子项验收](reports/phase-4-definitions.md);已补[有限决策器及内部结果交付](reports/phase-4-engine-core.md);[实例受理及首批事务](reports/phase-4-admission.md)已实现;[结果消费和根接续](reports/phase-4-runtime.md)已接入后台,顺序/分支/并行及真实进程恢复已验证;[TIMER与后续POLL轮次](13-workflow-clock.md)已接入;[信号消费和最终查询竞争](14-workflow-signals.md)已接入内部运行器;[内部控制与停止结清](15-workflow-controls.md)已接入;[内部核查与TASK新激活](16-workflow-recovery.md)已接入;等待恢复已接入内部服务;实例公共API/SDK与基础可运行场景已接入;流程任务来源已接入;完整历史与更多场景继续开发 |
|
||||
| P5 Weave 恢复与查询 | 有界查询、暂停继续、取消、人工核查恢复、控制门控与审计 | 轮次与尝试独立预算;暂停/开始/回执/超时竞争;恢复保留预算;未知结果不盲目重复 | 有界查询轮次/尝试独立预算及原截止恢复已接入内部运行器;最终信号竞争及在途查询结清已接入;内部暂停/继续/取消与失败结清已接入;执行核查、步骤结论、解除核查及TASK新激活已接入;[POLL跨激活恢复](17-workflow-poll-recovery.md)已接入;等待恢复已接入内部服务;公共API/SDK已接入;流程任务来源已接入;完整历史与更多场景继续开发 |
|
||||
| P6 生产验证与运维 | 完整监控、凭据轮换、备份恢复、滚动升级、运行手册、可复现负载和故障工具 | 对照生产验收清单执行,报告环境/指标/遗留项;容量、RPO/RTO 按真实拓扑验证 | 待开发 |
|
||||
| P7 首版交付核对 | SDK 兼容与发布准备、完整 API 手册、场景示例、全量回归及交付清单 | 新接入者按文档跑通全部示例;所有首版能力可追溯到实现与测试;报告实际生产边界 | 待开发 |
|
||||
|
||||
SDK、文档与示例随 P1–P5 同步开发,P7 是全量核对,不是最后才开始补文档。
|
||||
|
||||
P4/P5定时等待与后续查询轮次的实现及回归记录见[时钟报告](reports/phase-4-clock.md)。外部信号与最终查询竞争见[信号报告](reports/phase-4-signals.md)。公共实例、控制、信号、六类恢复和操作审计已接入HTTP与独立SDK,见[公共接入报告](reports/phase-5-public-api.md)。完整历史和来源仍须完成。
|
||||
P4/P5定时等待与后续查询轮次的实现及回归记录见[时钟报告](reports/phase-4-clock.md)。外部信号与最终查询竞争见[信号报告](reports/phase-4-signals.md)。公共实例、控制、信号、六类恢复和操作审计已接入HTTP与独立SDK,见[公共接入报告](reports/phase-5-public-api.md)。流程任务来源已接入,完整历史仍须完成。
|
||||
|
||||
### P4/P5 下一步实施顺序
|
||||
|
||||
1. 已实现FAIL_AFTER_SETTLED与显式取消的内部分支结清,见[控制报告](reports/phase-5-controls.md):持久取消意图、复用Pulse取消、收集已发出查询/任务结果、等待全部已激活工作结清后才进入失败或取消终态。效果未知仍保留核查。
|
||||
2. 已实现实例暂停/继续/取消内部操作,以control_revision、操作幂等身份、明确原因及审计保护控制决定;暂停不延长原截止,继续不覆盖核查或取消状态。
|
||||
3. 已实现内部执行核查、步骤结论、解除核查及TASK新激活和旧激活隔离,见[核查报告](reports/phase-5-recovery.md)。POLL跨激活恢复已实现(见[查询恢复](17-workflow-poll-recovery.md));[核查后PENDING接续和独立等待重建](18-workflow-wait-recovery.md)也已接入内部服务,保留原预算、轮次、结果和证据。
|
||||
4. 实例/当前步骤/信号/控制/六类恢复及流程操作审计HTTP和独立SDK已接入,步骤查询返回实际激活代次;并行执行与信号回执场景已有可运行示例。继续补齐实例筛选分页、完整激活/轮次/信号历史、信号资源审计与Pulse任务流程来源,并提供独立轮询及恢复示例。逐项验证原键恢复、权限、版本冲突、竞争与进程全停。
|
||||
4. 实例/当前步骤/信号/控制/六类恢复及流程操作审计HTTP和独立SDK已接入,步骤查询返回实际激活代次;并行执行与信号回执场景已有可运行示例。继续补齐实例筛选分页、完整激活/轮次/信号历史及信号资源审计,并提供独立轮询及恢复示例;[Pulse任务流程来源](api/task-source.md#5-流程固定来源)已交付。逐项验证原键恢复、权限、版本冲突、竞争与进程全停。
|
||||
5. 转入P6/P7的生产故障、容量、运维、发布与全部文档核对。内部存储阶段通过不会提前勾选公共接口或生产验收。
|
||||
|
||||
公共接入按以下调用链推进;本批已接入启动/当前详情、控制、信号、六类恢复和流程操作审计,并提供独立SDK及基础示例。以下历史、来源、分页和更多独立场景继续交付:
|
||||
公共接入按以下调用链推进;本批已接入启动/当前详情、控制、信号、六类恢复和流程操作审计,并提供独立SDK及基础示例。任务流程来源也已接入。以下完整历史、分页和更多独立场景继续交付:
|
||||
|
||||
| 调用链 | 需要补齐的内容 | 验收重点 |
|
||||
| --- | --- | --- |
|
||||
| 启动与读取 | 显式固定版本启动、当前实例、步骤及当前激活代次;后续补筛选分页和单次有界历史读取 | 原键丢回执恢复、当前权限、读取快照一致性、未激活步骤语义 |
|
||||
| 控制与信号 | 暂停/继续/取消、固定步骤和代次的信号提交及原受理回执 | control_revision与通用revision区分、迟到/旧代次、暂停期间结果收集 |
|
||||
| 核查与追踪 | 六类人工恢复操作、激活/轮次/等待/信号及管理审计读取、Pulse任务流程来源 | 当前实例/步骤/任务版本、证据和显式声明、旧历史保留、有界响应和权限隔离 |
|
||||
| 核查与追踪 | 六类人工恢复操作、完整激活/轮次/等待/信号历史读取及信号管理审计;Pulse任务流程来源已交付 | 当前实例/步骤/任务版本、证据和显式声明、旧历史保留、有界响应和权限隔离 |
|
||||
| 通用接入场景 | 并行汇合、外部回执、有限轮询、暂停核查恢复的可运行SDK示例 | 真实Worker执行、完整进程退出后接续、未知效果保留、全链路回归 |
|
||||
|
||||
接口只使用已经落地的内部事务规则;SDK保持独立module,不能引用服务端模型或数据库实现。生产故障及容量结论仍由P6专门验收。
|
||||
@@ -67,7 +67,7 @@ P4/P5定时等待与后续查询轮次的实现及回归记录见[时钟报告](
|
||||
| 批量任务受理 | 已实现[批量API](api/batch-tasks.md)、独立SDK及[补交示例](examples/batch.md);真实MySQL部分失败与HTTP响应丢失用例已通过,同键并发20轮及全量回归已通过,见[报告](reports/phase-3-batch-tasks.md) |
|
||||
| 独立任务人工核查与重试 | 已实现[管理API及SDK](api/task-recovery.md)、专门权限、显式安全声明、证据/版本/审计和关联新任务;[完整场景](examples/recovery.md)及[回归报告](reports/phase-3-task-recovery.md)同步交付 |
|
||||
| 任务查询筛选 | 已实现[业务键及创建时间查询](api/task-queries.md),v2游标绑定全部筛选、旧游标受限兼容、四种索引路径与[完整场景](examples/task-query.md);[回归报告](reports/phase-3-task-queries.md)同步记录 |
|
||||
| 任务详情来源追踪 | 已实现[独立来源接口](api/task-source.md)、SDK和普通/计划/人工恢复场景,返回计划及触发固定版本;同命名空间归属、当前权限和来源缺失拒绝已通过[全量回归](reports/phase-3-task-source.md),流程来源随Weave接入 |
|
||||
| 任务详情来源追踪 | 已实现[独立来源接口](api/task-source.md)、SDK和普通/计划/人工恢复场景,返回计划及触发固定版本;同命名空间归属、当前权限和来源缺失拒绝已通过[全量回归](reports/phase-3-task-source.md),流程来源已按[专项报告](reports/phase-5-task-source.md)接入 |
|
||||
| 业务到平台的事务Outbox接入 | 已实现[独立业务模块及完整接入](examples/task-outbox.md),覆盖业务变更/待发请求同事务、有限发送恢复、CLI及真实HTTP/MySQL/进程故障,见[报告](reports/phase-3-task-outbox.md);核心SDK保持无ORM/数据库依赖 |
|
||||
|
||||
精确A04派发消息未送达时的进程故障、慢消费者/重连风暴、凭据安全重绑、历史清理、全量监控/容量与MySQL故障切换仍按P6执行;Weave的通用执行门控/内部事件接续随P4–P5落实,不将外部结果订阅当作内部流程引擎。
|
||||
|
||||
@@ -74,7 +74,7 @@ v16及以前的未处理记录缺少冻结来源,升级后统一标为QUARANTI
|
||||
|
||||
## 4. 后续存储适配必须满足的条件
|
||||
|
||||
以下保留存储运行器的完整要求。第1项已按[受理报告](reports/phase-4-admission.md)验证;第2–4项结果消费和根接续已接入[实际运行器](12-workflow-runtime.md),第5项的TIMER/POLL已接入[时钟运行器](13-workflow-clock.md),第5项的信号等待已接入[信号运行器](14-workflow-signals.md),内部控制与结清已接入[控制运行器](15-workflow-controls.md),[核查与TASK新激活](16-workflow-recovery.md)已接入;公共接口和SDK已接入,完整历史及来源继续实现:
|
||||
以下保留存储运行器的完整要求。第1项已按[受理报告](reports/phase-4-admission.md)验证;第2–4项结果消费和根接续已接入[实际运行器](12-workflow-runtime.md),第5项的TIMER/POLL已接入[时钟运行器](13-workflow-clock.md),第5项的信号等待已接入[信号运行器](14-workflow-signals.md),内部控制与结清已接入[控制运行器](15-workflow-controls.md),[核查与TASK新激活](16-workflow-recovery.md)已接入;公共接口和SDK已接入,流程任务来源已接入,完整历史继续实现:
|
||||
|
||||
1. 启动时认证、固定不可变版本/输入和策略、校验全部队列、计算实例截止,并在同事务创建实例、门控、首批激活/任务及审计回执。相同身份返回原实例。
|
||||
2. 消费者领取内部事件后核对命名空间、来源任务版本、激活/轮次及当前步骤版本;消费确认、步骤变化、后续任务或持久化待续记录同事务提交。
|
||||
|
||||
@@ -64,4 +64,4 @@ flowchart LR
|
||||
|
||||
进程回归由`make integration`构建二进制后显式执行。缺少一次性数据库或`ORBIT_TEST_SERVER_BINARY`时测试会跳过;跳过不构成进程恢复证据。验证记录见[本阶段报告](reports/phase-4-runtime.md)。
|
||||
|
||||
持久化信号等待及查询最终信号竞争已按[信号运行约定](14-workflow-signals.md)实现。内部控制及停止结清也已接入。实例公共API与独立SDK已接入,下一步包括完整历史、来源公共API及更多通用场景。P4整体及P5–P7继续按[完整计划](08-development-plan.md)执行。
|
||||
持久化信号等待及查询最终信号竞争已按[信号运行约定](14-workflow-signals.md)实现。内部控制及停止结清也已接入。实例公共API与独立SDK已接入,下一步包括完整历史、实例筛选分页及更多通用场景;流程任务来源已接入。P4整体及P5–P7继续按[完整计划](08-development-plan.md)执行。
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
| `GET /health/live` | 已实现 | [健康检查](health.md) |
|
||||
| `GET /health/ready` | 已实现,验证数据库、迁移记录及零外键要求 | [健康检查](health.md) |
|
||||
| `/v1/tasks` 提交、查询、分页与待执行取消 | 已实现,P3扩展业务键与创建时间筛选 | [任务接口](tasks.md) / [查询契约](task-queries.md) |
|
||||
| `GET /v1/tasks/{task_id}/source` | P3已实现普通、人工重试与计划固定版本来源 | [来源查询](task-source.md) |
|
||||
| `GET /v1/tasks/{task_id}/source` | 已实现普通、人工重试、计划固定版本及流程历史激活/轮次来源 | [来源查询](task-source.md) |
|
||||
| `POST /v1/tasks:batch` | P3 已实现逐项受理、独立幂等、部分结果与补交 | [批量任务](batch-tasks.md) |
|
||||
| `/v1/tasks/{task_id}:review` / `:retry` 与 `/operations` | P3 已实现带证据核查、关联新任务与操作审计 | [人工恢复](task-recovery.md) |
|
||||
| `/v1/tasks/{task_id}/attempts` 与尝试详情 | P2 已实现 | [执行历史](execution-history.md) |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 任务直接来源查询
|
||||
|
||||
状态:P3已实现服务端、独立SDK及普通任务、计划、人工恢复示例。接口只读,使用已有模型和索引,不增加数据库外键或迁移。验证证据见[回归报告](../reports/phase-3-task-source.md)。
|
||||
状态:已实现普通任务、人工重试、计划和流程任务来源的服务端、独立SDK及示例。接口只读,使用已有模型和索引,不增加数据库外键或迁移。证据见[P3报告](../reports/phase-3-task-source.md)和[流程来源报告](../reports/phase-5-task-source.md)。
|
||||
|
||||
## 1. 请求与权限
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
请求头:`Authorization: Bearer <token>`。不需要请求体、Content-Type或Idempotency-Key,不接受任何查询参数。task_id为32位小写十六进制ID;认证决定命名空间,URL不能覆盖它。
|
||||
|
||||
权限为`tasks:read`及任务所属队列范围。每次请求验证当前凭据;不存在、跨命名空间或不在队列范围的任务均返回404。只获得来源引用,不因此获得计划定义、模板、管理或执行权限;读取完整计划及固定版本仍需`schedules:read`,见[计划手册](schedules.md)。
|
||||
权限为`tasks:read`及任务所属队列范围。每次请求验证当前凭据;不存在、跨命名空间或不在队列范围的任务均返回404。只获得来源引用,不因此获得计划/流程定义、其他步骤、管理或执行权限。读取完整计划及固定版本仍需`schedules:read`;读取流程需`workflows:read`及全部固定队列范围,读取流程定义需`workflows:definitions:read`。只拥有一个队列任务权限时,仍能读取该任务的有限流程来源。
|
||||
|
||||
```sh
|
||||
curl "$ORBIT_URL/v1/tasks/$TASK_ID/source" \
|
||||
@@ -22,7 +22,7 @@ HTTP 200,使用`request_id`和`data`信封;X-Request-ID与正文一致。下
|
||||
| 字段 | 类型 / 必填 | 含义 |
|
||||
| --- | --- | --- |
|
||||
| task_id | string / 是 | 已授权查询的任务ID |
|
||||
| kind | string / 是 | DIRECT、MANUAL_RETRY或SCHEDULE |
|
||||
| kind | string / 是 | DIRECT、MANUAL_RETRY、SCHEDULE或WORKFLOW |
|
||||
| retry_of | string / 仅MANUAL_RETRY | 同命名空间、同队列的直接原任务ID |
|
||||
| schedule | object / 仅SCHEDULE | 触发该任务的固定关联,字段如下 |
|
||||
| schedule.schedule_id | string / 是 | 来源计划ID |
|
||||
@@ -31,6 +31,7 @@ HTTP 200,使用`request_id`和`data`信封;X-Request-ID与正文一致。下
|
||||
| schedule.scheduled_at | UTC RFC3339 / 是 | 原计划时间,最多微秒精度,与实际受理/执行时间分开 |
|
||||
| schedule.decision | string / 是 | FIRED单点触发或COALESCED合并触发 |
|
||||
| schedule.covered_until | UTC RFC3339 / 仅COALESCED | 合并范围的排除上界,严格晚于scheduled_at |
|
||||
| workflow | object / 仅WORKFLOW | 此任务创建时的流程来源,字段见第5节 |
|
||||
|
||||
DIRECT表示普通任务受理,包括单项和批量受理;任务内部的自动安全重试仍属于同一个任务,不改变来源。MANUAL_RETRY表示[人工重试](task-recovery.md)创建的新任务,只返回直接父任务,不递归遍历整条重试链。父任务继续保留原历史。
|
||||
|
||||
@@ -85,7 +86,9 @@ SCHEDULE中的版本来自触发记录,不能用计划最新版本替换。COA
|
||||
|
||||
## 3. 关联校验与错误
|
||||
|
||||
平台采用无外键设计,本接口在认证事务内显式核对命名空间、任务、队列、计划、不可变版本与触发记录。人工重试父任务须为同队列中已失败/取消的独立任务。无所有者但存在触发记录、悬空父任务、缺失版本、错误队列、未知所有者或当前未支持的门控均拒绝,不能把关联损坏降级成DIRECT。
|
||||
平台采用无外键设计,本接口在认证事务内显式核对命名空间、任务、队列、计划或流程、不可变版本和创建记录。人工重试父任务须为同队列中已失败/取消的独立任务。流程来源核验实例门控、版本摘要与冻结策略、固定步骤处理器契约、任务与激活或轮次的双向关系;恢复父任务还须属于同一步骤的前一激活,POLL须为同一业务轮。
|
||||
|
||||
无所有者但存在触发/激活/轮次反向记录、同时关联不同来源种类、悬空父任务、缺失版本、错误队列或未知所有者均拒绝,不能把关联损坏降级成DIRECT。查询沿现有唯一索引读取当前任务及至多一个直接父任务,不递归遍历恢复历史,不锁运行器父资源,也不进入派发路径。
|
||||
|
||||
| HTTP / code | 处理 |
|
||||
| --- | --- |
|
||||
@@ -117,6 +120,11 @@ case "SCHEDULE":
|
||||
fmt.Println("来源计划", source.Schedule.ScheduleID,
|
||||
"固定版本", source.Schedule.ScheduleVersion,
|
||||
"触发记录", source.Schedule.OccurrenceID)
|
||||
case "WORKFLOW":
|
||||
fmt.Println("所属流程", source.Workflow.WorkflowID,
|
||||
"步骤", source.Workflow.StepKey,
|
||||
"激活代次", source.Workflow.ActivationSequence,
|
||||
"业务查询轮次", source.Workflow.PollRound)
|
||||
}
|
||||
```
|
||||
|
||||
@@ -127,5 +135,53 @@ SDK的ScheduleVersion为uint64,JSON仍为字符串;时间使用time.Time。S
|
||||
| 单项受理、取消后读取来源 | [tasks](../../sdk/go/examples/tasks/main.go) | [SDK初始化](../sdk/README.md),source_kind=DIRECT |
|
||||
| 按计划找到触发任务,再反查来源 | [schedules](../../sdk/go/examples/schedules/main.go) | [计划场景](schedules.md#6-sdk-与完整示例),source_kind=SCHEDULE、fixed_version=1 |
|
||||
| 人工核查后创建关联新任务 | [recovery](../../sdk/go/examples/recovery/main.go) | [恢复场景](../examples/recovery.md),source_kind=MANUAL_RETRY、parent=原任务ID |
|
||||
| 并行流程完成后核对每项任务来源 | [workflow](../../sdk/go/examples/workflow/main.go) | [流程场景](../examples/workflow.md),workflow_sources_verified=3、fixed_version=v1 |
|
||||
|
||||
上述示例均运行在隔离回归中;新发布计划版本后老任务仍指向旧版本,由真实数据库与SDK集成测试验证。Weave流程来源随P4–P5实现,目前没有WORKFLOW响应。此接口为新增只读路由,不更改Task/TaskSummary或Worker消息结构,不增加权限配置;新客户端调用旧节点的404不能理解为DIRECT。
|
||||
上述示例均运行在隔离回归中;新发布计划/流程版本后老任务仍指向原版本,人工恢复后旧激活仍可追溯。WORKFLOW是新增来源种类,旧SDK可能按未知种类返回错误;应升级SDK,不能降级为DIRECT。不更改Task/TaskSummary或Worker消息结构,不增加权限配置;新客户端调用旧节点的404/503同样不能理解为DIRECT。
|
||||
|
||||
## 5. 流程固定来源
|
||||
|
||||
以下字段位于`data.workflow`,只适用于TASK和POLL产生的业务任务:
|
||||
|
||||
| 字段 | 类型 / 必填 | 含义 |
|
||||
| --- | --- | --- |
|
||||
| workflow_id | string / 是 | 所属流程实例 |
|
||||
| definition_id | string / 是 | 稳定定义身份 |
|
||||
| definition_version_id | string / 是 | 实例固定的版本记录身份 |
|
||||
| version | string / 是 | 固定发布版本名,不解析最新版本 |
|
||||
| step_id / step_key | string / 是 | 逻辑步骤身份及固定名称 |
|
||||
| step_kind | string / 是 | TASK或POLL |
|
||||
| activation_id | string / 是 | 创建此任务的历史激活身份 |
|
||||
| activation_sequence | uint32 / 是 | 步骤激活代次,从1开始;并非当前激活代次 |
|
||||
| poll_round | uint32 / 仅POLL | 首次查询开始累计的业务轮编号;人工恢复同轮不重置 |
|
||||
| poll_round_id | string / 仅POLL | 唯一关联该任务的轮次记录身份 |
|
||||
| retry_of | string / 恢复任务可有 | 同步骤、前一激活的直接旧任务;POLL还要求同一业务轮 |
|
||||
|
||||
TASK第二代及之后必有workflow.retry_of;POLL只在恢复激活的首轮任务上带此关联,后续正常业务轮没有retry_of。顶层retry_of仍只用于MANUAL_RETRY;流程恢复任务的kind一直是WORKFLOW。自动尝试重试不创建新任务,也不改变来源。
|
||||
|
||||
第二代激活重查原第2业务轮的完整响应:
|
||||
|
||||
```json
|
||||
{
|
||||
"request_id":"44444444444444444444444444444444",
|
||||
"data":{
|
||||
"task_id":"11111111111111111111111111111111",
|
||||
"kind":"WORKFLOW",
|
||||
"workflow":{
|
||||
"workflow_id":"22222222222222222222222222222222",
|
||||
"definition_id":"33333333333333333333333333333333",
|
||||
"definition_version_id":"55555555555555555555555555555555",
|
||||
"version":"v1",
|
||||
"step_id":"66666666666666666666666666666666",
|
||||
"step_key":"query","step_kind":"POLL",
|
||||
"activation_id":"77777777777777777777777777777777",
|
||||
"activation_sequence":2,
|
||||
"poll_round":2,
|
||||
"poll_round_id":"88888888888888888888888888888888",
|
||||
"retry_of":"99999999999999999999999999999999"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
流程暂停、结束、发布新版本或后续人工恢复,都不会把旧任务的来源改指向新激活。要取得当前步骤需另调[GetWorkflowStep](workflows.md),不要用来源中的历史代次向当前等待发送信号。完整激活/轮次历史分页仍按开发计划推进,本接口一次只查一个任务的直接来源。
|
||||
|
||||
@@ -123,7 +123,7 @@ curl "$ORBIT_URL/v1/tasks/$TASK_ID" -H "Authorization: Bearer $ORBIT_TOKEN"
|
||||
|
||||
SDK:`Client.GetTask(ctx, taskID)`。
|
||||
|
||||
任务直接来源独立通过`GET /v1/tasks/{task_id}/source`读取,SDK为`GetTaskSource(ctx, taskID)`;可定位普通受理、人工重试父任务、来源计划/触发记录/固定版本。使用相同的tasks:read和队列范围,详情见[来源查询](task-source.md)。来源未嵌入Task或列表摘要,读取完整计划仍需计划权限。
|
||||
任务直接来源独立通过`GET /v1/tasks/{task_id}/source`读取,SDK为`GetTaskSource(ctx, taskID)`;可定位普通受理、人工重试父任务、来源计划/触发记录,以及流程固定版本/步骤/激活代次/查询轮次。使用相同的tasks:read和队列范围,详情见[来源查询](task-source.md)。来源未嵌入Task或列表摘要,读取完整计划或流程仍需各自权限。
|
||||
|
||||
## GET /v1/tasks
|
||||
|
||||
|
||||
@@ -143,4 +143,4 @@ fmt.Println(audit.Action, receipt.Instance.State)
|
||||
|
||||
新路由仅在本开发版本及之后可用;旧服务返回404时不能降级为普通任务重试来绕过Weave所有权。SDK类型独立、版本字段保留uint64精度。规则及数据模型未增加表、字段、外键或级联。
|
||||
|
||||
本批尚不提供完整历史激活/轮次遍历、实例筛选列表或信号资源审计列表;当前输入结果、当前查询预算、单条信号和流程管理审计可读。生产数据库切换、容量及恢复目标继续按P6验证,见[阶段报告](../reports/phase-5-public-api.md)。
|
||||
本批尚不提供完整历史激活/轮次遍历、实例筛选列表或信号资源审计列表;当前输入结果、当前查询预算、单条信号、流程管理审计及[任务历史激活来源](task-source.md#5-流程固定来源)可读。生产数据库切换、容量及恢复目标继续按P6验证,见[阶段报告](../reports/phase-5-public-api.md)。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
状态:下表公共 HTTP 与独立 Go SDK 已接入。定义发布见[定义接口](workflow-definitions.md),人工恢复见[恢复接口](workflow-recovery.md),完整运行例子见[并行作业与回执](../examples/workflow.md)。SDK 尚未发布正式版本,服务端与 SDK 应使用同一开发版本。
|
||||
|
||||
实例筛选分页、历史激活/轮次/信号列表及 Pulse 任务的流程来源查询继续开发。旧冻结回执可能不含新增的activation_sequence,应另读当前步骤详情;当前步骤详情只反映当前激活;旧记录保留在数据库,不能把本页的当前视图当作全部历史。
|
||||
实例筛选分页及历史激活/轮次/信号列表继续开发;[Pulse任务流程来源](task-source.md#5-流程固定来源)已接入。旧冻结回执可能不含新增的activation_sequence,应另读当前步骤详情;当前步骤详情只反映当前激活;旧记录保留在数据库,不能把本页的当前视图当作全部历史。
|
||||
|
||||
## 1. 路由、权限与 SDK
|
||||
|
||||
|
||||
@@ -182,7 +182,8 @@
|
||||
|
||||
## 已可运行:从任务定位来源
|
||||
|
||||
- [来源接口与SDK](../api/task-source.md)随现有tasks、schedules、recovery三个示例运行,无额外服务或数据库表。
|
||||
- [来源接口与SDK](../api/task-source.md)随现有tasks、schedules、recovery和workflow四个示例运行,无额外服务或数据库表。
|
||||
- 步骤:取得任务ID → GetTaskSource → 区分普通提交/人工重试/计划触发 → 按权限读取父任务或固定计划版本。
|
||||
- 预期:source_kind分别为DIRECT、MANUAL_RETRY、SCHEDULE;人工重试关联原任务,计划任务保留实际触发版本。
|
||||
- 异常:来源缺失或归属不匹配返回503,不能降级为DIRECT;新计划版本不覆盖历史版本,引用查询不授予计划定义读取权限。
|
||||
- workflow示例逐项核对三个任务所属流程、固定版本、逻辑步骤及创建激活,输出workflow_sources_verified=3;恢复旧激活和POLL轮次由SDK集成测试覆盖。
|
||||
- 异常:来源缺失或归属不匹配返回503,不能降级为DIRECT;新版本不覆盖历史版本,引用查询不授予完整计划或流程读取权限。
|
||||
|
||||
@@ -31,12 +31,13 @@ go run ./examples/workflow
|
||||
|
||||
## 2. 调用链与输出
|
||||
|
||||
CreateWorkflowDefinition → PublishWorkflowVersion(v1) → StartWorkflow → 原键再次StartWorkflow → 自动Worker并行执行 → GetWorkflowStep读取当前信号契约与代次 → SendWorkflowSignal → 原键再次发送 → 后继任务完成 → GetWorkflow → Worker有界排空。
|
||||
CreateWorkflowDefinition → PublishWorkflowVersion(v1) → StartWorkflow → 原键再次StartWorkflow → 自动Worker并行执行 → GetWorkflowStep读取当前信号契约与代次 → SendWorkflowSignal → 原键再次发送 → 后继任务完成 → GetWorkflow → GetWorkflowSteps和GetTaskSource核对三个任务的固定来源 → Worker有界排空。
|
||||
|
||||
预期输出中的ID每次运行不同:
|
||||
|
||||
```text
|
||||
workflow=<32位实例ID> state=SUCCEEDED result={"text":"HELLO ORBIT"} start_deduplicated=true signal_deduplicated=true
|
||||
workflow_sources_verified=3 fixed_version=v1
|
||||
worker_drained=true started=3 confirmed=3
|
||||
```
|
||||
|
||||
@@ -54,4 +55,4 @@ worker_drained=true started=3 confirmed=3
|
||||
|
||||
[公共SDK集成测试](../../sdk/go/workflow_instances_integration_test.go)还实际运行:启动响应丢失的原键恢复;暂停/继续、定时等待、信号消费和取消;UNKNOWN执行核查、步骤结论及解除核查;剩余尝试内TASK重试与SIGNAL换代;确认PENDING后沿原查询预算继续。使用`make integration`在一次性环境复现。
|
||||
|
||||
历史激活列表、流程来源查询、更多独立业务示例及生产验收仍按[计划](../08-development-plan.md)推进。
|
||||
历史激活列表、更多独立业务示例及生产验收仍按[计划](../08-development-plan.md)推进。
|
||||
|
||||
32
docs/reports/phase-5-task-source.md
Normal file
32
docs/reports/phase-5-task-source.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# P4/P5 流程任务来源追踪回归
|
||||
|
||||
日期:2026-09-18。本批补齐既有GetTaskSource路由和独立SDK的WORKFLOW种类,保留P4/P5完整历史、分页、信号审计和独立恢复示例等剩余范围。
|
||||
|
||||
## 实现与边界
|
||||
|
||||
- 任务可追溯到所属流程、固定定义版本、逻辑步骤、创建时的激活身份及代次;POLL同时返回业务轮编号和该任务对应的轮次记录。后续发布、流程结束或人工恢复不改指旧任务来源。
|
||||
- TASK/POLL人工恢复任务保持WORKFLOW种类,workflow.retry_of只返回直接旧任务。恢复父任务须为同一步骤的前一激活,POLL还须属于同一业务轮;新一业务轮没有恢复父任务。
|
||||
- tasks:read和任务队列范围只授予有限来源引用,不扩展成整个流程/其他队列/定义/管理权限。来源不返回业务输入、结果或完整定义。
|
||||
- 查询显式核对命名空间、门控、固定定义摘要/策略、步骤处理器契约、正反向任务归属及直接父任务。所有者丢失、跨来源种类或缺失关联返回错误,不推测DIRECT;独立人工重试的父任务也校验反向关联。
|
||||
- 所有查询沿已有主键、任务唯一键及步骤代次唯一键定位;不递归展开历史,不引入运行器父资源锁,不改变状态、额度或审计,不进入派发路径。新增SDK及响应字段均有中文注释,无新增持久化字段、迁移或外键。
|
||||
|
||||
## 验证
|
||||
|
||||
环境:darwin/arm64、Go 1.27.1、Docker MySQL 8.4.10;一次性隔离数据库、真实Orbit二进制与独立SDK。
|
||||
|
||||
| 验证 | 实际结果 |
|
||||
| --- | --- |
|
||||
| 基础检查 | make fmt/test/vet/build通过,包含竞态、静态检查和各独立模块构建 |
|
||||
| 来源与恢复专项 | 存储包33.366秒通过;普通/计划/独立人工重试来源、TASK/POLL跨激活恢复及新来源损坏/权限场景 |
|
||||
| HTTP与独立SDK专项 | 包30.638秒通过;五组实例场景29.23秒,含TASK恢复、POLL原间隔下一轮和人工恢复同一业务轮的来源读取 |
|
||||
| 可运行示例 | workflow例子SUCCEEDED;workflow_sources_verified=3、fixed_version=v1,三个任务全部确认并排空 |
|
||||
| 最终完整隔离回归 | scripts/test-mysql.sh退出0;存储210.939秒、流程进程恢复48.982秒、流程SDK24.214秒(五组实例22.69秒)、最终进程故障组97.183秒;20个SDK示例及2个业务模块全部通过,包含独立人工重试父任务反向关联拒绝;一次性环境已清理 |
|
||||
| 模型与文档 | 305个直接持久化字段中文注释完整;实际MySQL为v22,外键0、业务字段缺COMMENT为0;1011个本地链接及62个JSON示例检查通过 |
|
||||
|
||||
专项验证固定版本发布后不变、仅有单队列tasks:read也能查当前任务来源、读取完整流程/定义仍拒绝、跨命名空间/队列拒绝;逐项注入错误所有者、门控、处理器版本、激活所属流程/步骤、任务反向引用、步骤类型、固定版本及策略错误;测试同时出现TASK/POLL关联、POLL父任务错误轮次及所有者丢失。真实恢复链验证业务第1轮→恢复第1轮→第2轮→再次恢复第2轮,激活与业务轮分别计数,原历史可读。
|
||||
|
||||
源码:[来源存储](../../internal/storage/mysql/task_workflow_source.go)、[关联损坏及权限测试](../../internal/storage/mysql/task_workflow_source_integration_test.go)、[TASK恢复](../../internal/storage/mysql/workflow_recovery_integration_test.go)、[POLL恢复](../../internal/storage/mysql/workflow_poll_recovery_integration_test.go)、[SDK协议验证](../../sdk/go/task_source_test.go)、[真实SDK链路](../../sdk/go/workflow_instances_integration_test.go)、[运行例子](../../sdk/go/examples/workflow/main.go)。完整复现入口:`make integration`,见[隔离脚本](../../scripts/test-mysql.sh)。
|
||||
|
||||
## 继续交付
|
||||
|
||||
本接口是单任务固定来源,不等同于流程完整历史浏览。实例筛选分页、历史激活/轮次/信号读取、信号资源审计和更多独立恢复示例继续按[计划](../08-development-plan.md)推进;随后核对P4/P5原功能范围,开展P6/P7监控、运维、容量及生产故障验收。本机回归不证明生产MySQL复制、跨故障域可用性或实际RPO/RTO。
|
||||
@@ -124,7 +124,7 @@ fmt.Println(cancelled.Task.State)
|
||||
| Liveness / Readiness | Health | [健康](../api/health.md) |
|
||||
| SubmitTask | SubmitTaskRequest / SubmitTaskResult | [任务](../api/tasks.md) |
|
||||
| GetTask | taskID / Task | [任务](../api/tasks.md) |
|
||||
| GetTaskSource | taskID / TaskSource,直接来源及计划固定版本 | [来源查询](../api/task-source.md) |
|
||||
| GetTaskSource | taskID / TaskSource,普通/恢复/计划及流程固定版本、历史激活与轮次 | [来源查询](../api/task-source.md) |
|
||||
| ListTasks | ListTasksRequest / TaskPage,业务键及创建时间范围 | [查询](../api/task-queries.md) |
|
||||
| CancelTask | taskID、key、CancelTaskRequest / CancelTaskResult | [任务](../api/tasks.md) |
|
||||
| CreateQueue | key、CreateQueueRequest / CreateQueueResult | [队列](../api/queues.md) |
|
||||
@@ -202,3 +202,5 @@ P2 已提供底层协议、[自动 Worker 运行器及示例](worker-runtime.md)
|
||||
## 流程定义发布
|
||||
|
||||
已提供独立WorkflowSpecification类型及CreateWorkflowDefinition、GetWorkflowDefinition、PublishWorkflowVersion、GetWorkflowVersion四个HTTP方法。业务侧研发显式发布,服务端冻结版本;实例执行使用[StartWorkflow等方法](../api/workflows.md),完整运行见[示例](../examples/workflow.md)。见[接口与字段](../api/workflow-definitions.md)、[结构版本1](../api/workflow-definition-format.md)、[完整可运行场景](../examples/workflow-definition.md)。
|
||||
|
||||
流程任务同样调用`GetTaskSource`,kind为WORKFLOW时读取workflow中的固定版本、步骤、历史激活代次、查询轮次和直接恢复父任务。该代次不表示当前等待目标;发送信号须另读GetWorkflowStep。完整字段及兼容边界见[来源接口](../api/task-source.md#5-流程固定来源),[workflow示例](../examples/workflow.md)实际核对三个任务来源。
|
||||
|
||||
Reference in New Issue
Block a user