Files
orbit/docs/reports/phase-4-5.md

75 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P4/P5 平台功能阶段验收与生产边界
日期:2026-09-18。本报告按[原流程功能](../06-workflow-spec.md)、[开发计划](../08-development-plan.md)及[生产故障矩阵W01–W17](../05-production-acceptance.md)核对,保留未完成项。原功能均有服务端、公共HTTP/独立SDK、场景及异常回归证据;版本/暂停/全停与提交边界的补强完成后,P4/P5平台功能阶段验收通过。P6/P7及持续目标保持进行中,生产负载、部署拓扑和发布兼容不包含在这一结论中。
新增补强:[版本、暂停竞争与全停恢复回归](phase-4-5-races.md)提供W06/W09/W14/W15的实际事务及公共SDK进程证据。另有[A04/W01/W13/W16故障边界](phase-6-fault-boundaries.md)的真实派发未送达、COMMIT前后断线和最终信号竞争证据。下表随两批更新,原轮询/恢复示例的验证记录保留。
## 首批独立场景交付
新增两个独立可运行SDK示例,均只导入公开SDK及示例内部辅助包,不访问Orbit数据库或服务端模型:
- [有界轮询](../examples/workflow-poll.md):先提交一次,实际HTTP查询503→PENDING→DONE,2轮3次尝试;另一流程两轮PENDING后转核查,2轮2次尝试。历史分页、任务来源、实际HTTP次数、原截止和Worker排空逐项断言。
- [带证据恢复](../examples/workflow-recovery.md):本地渠道保存提交结果后直接关闭HTTP连接,Worker报UNKNOWN;暂停、查询原操作证据、执行核查、步骤结论、解除核查、显式恢复暂停,再完成后继任务。断线实际发生,外部提交只发生1次,精确序号9007199254740993、旧UNKNOWN尝试、同键审计及暂停标记均保留。
外部系统为进程内受控HTTP夹具,不是持久业务渠道。恢复示例能证明唯一提交已经结束,并据此模拟管理员的明确决定;不能据此把真实业务核查自动化。平台事务与外部业务副作用的责任边界没有改变。
没有新增模型字段、数据库迁移、外键或级联。平台仍为36个模型、312个直接持久化字段;中文注释保持。标准回归加入这两个命令,目前共23个可运行SDK示例和2个独立业务模块;examples/internal/flowdemo是共享辅助包,不计为可运行示例。
## 原功能逐项对应
| 已确认能力 | 实现与可运行入口 | 已有直接验证证据 |
| --- | --- | --- |
| 研发定义发布、类型和资源约束 | [定义API](../api/workflow-definitions.md)、[结构格式](../api/workflow-definition-format.md)、workflow-definition例子 | [定义存储回归](../../internal/storage/mysql/workflow_definitions_integration_test.go):并发同键/同版本、精确数字、非法/损坏定义、权限撤销、事务失败;[SDK](../../sdk/go/workflow_definitions_integration_test.go)提交后丢回执原键恢复 |
| 顺序、条件分支、有限并行汇合 | weave/engine与持久运行器;[workflow例子](../examples/workflow.md)实际并行后汇合 | [决策器测试](../../weave/engine/plan_test.go)精确条件、分支选择冻结与预算;[实例](../../internal/storage/mysql/workflow_instances_integration_test.go)覆盖六种初始节点;[推进](../../internal/storage/mysql/workflow_runtime_integration_test.go)重复消费、并行结果只建一个后继、满额回滚和根待续 |
| 固定版本及输入 | StartWorkflow显式version;GetWorkflowVersion及实例来源 | 实例并发受理固定版本、发布v2后原键回执保留;[实例查询](../../internal/storage/mysql/workflow_query_integration_test.go)继续按v1全部队列授权。新增版本回归实际完成v1后继和v2新实例,验证不同处理器/输入、原版本与原截止 |
| SIGNAL等待、早到和旧代次隔离 | [信号约定](../14-workflow-signals.md)、SendWorkflowSignal及workflow例子 | [受理](../../internal/storage/mysql/workflow_signals_integration_test.go)身份/契约/范围/事务;[消费](../../internal/storage/mysql/workflow_signal_runtime_integration_test.go)并发赢家、真实到期、及时受理晚消费、篡改及最终查询结清 |
| TIMER持久等待、原截止 | [时钟约定](../13-workflow-clock.md)、workflow例子 | [时钟存储](../../internal/storage/mysql/workflow_clock_integration_test.go)自然到期、重复消费、实例截止截断;[真实进程](../../internal/storage/mysql/workflow_runtime_process_integration_test.go)全停、两新节点接续 |
| 有界查询与独立尝试预算 | [workflow-poll例子](../examples/workflow-poll.md)、POLL定义与历史轮次API | 时钟存储验证同轮重试、下一轮、满额/暂停不耗轮次、截止与在途结果;新例子分别验证成功和耗尽后的实际请求次数 |
| 暂停/继续、取消、分支失败结清 | [公共控制](../api/workflows.md)、[停止规则](../15-workflow-controls.md) | [控制回归](../../internal/storage/mysql/workflow_controls_integration_test.go)原control_revision、原键/并发/撤权、开始与取消竞争、并行FAIL_AFTER_SETTLED、UNKNOWN不终结、超过32步待续;新增真实锁等待重叠的PAUSE/开始/领取/后继/重试竞争 |
| 人工核查、TASK/POLL重试及等待恢复 | [六类恢复API](../api/workflow-recovery.md)、workflow-recovery例子 | [TASK恢复](../../internal/storage/mysql/workflow_recovery_integration_test.go)、[POLL恢复](../../internal/storage/mysql/workflow_poll_recovery_integration_test.go)、[等待恢复](../../internal/storage/mysql/workflow_wait_recovery_integration_test.go):旧激活、尝试/轮次/原截止、证据、失败回滚、当前版本和停止意图 |
| 完整查询与审计入口 | 当前详情、[历史](../api/workflow-history.md)、[实例筛选](../api/workflow-queries.md)、[状态事件](../api/workflow-events.md)、[任务来源](../api/task-source.md) | 对应存储回归验证当前与历史激活区分、分页、归属损坏、全部固定队列权限;[独立SDK](../../sdk/go/workflow_instances_integration_test.go)覆盖六类恢复和读取,时间线另有SDK与批量事件回滚验证 |
| 不依赖内存的接续 | MySQL检查点、内部Inbox、额度、门控与同事务事件 | 真实流程进程测试先确认原进程SIGKILL退出,再启动两个新节点;结果、TIMER/POLL、早到/最终信号、停止意图、TASK/POLL人工恢复及等待换代均保留 |
上述“已有证据”是相应断言的范围,不等于任意并发交错、数据库故障拓扑或业务渠道已验收。API字段与限制以当前接口手册为准;旧阶段报告保留当时状态,不回写成后来全部完成。
## W01–W17 故障矩阵核对
| 编号 | 当前证据 | 仍需补强的具体边界 |
| --- | --- | --- |
| W01 | SQL失败/SAVEPOINT回滚及实例启动、后继创建的真实COMMIT前后断线;原身份恢复且状态/任务/消费确认原子一致,见[故障边界](phase-6-fault-boundaries.md) | MySQL进程/复制故障、存储持久化组合继续P6 |
| W02 | 结果持久化后全控制节点退出,两新节点消费,后继不重复 | 生产数据库切换另按P6,不与应用进程强杀等同 |
| W03 | 早到、重复、迟到、错误关联及代次的实际存储与SDK回归 | 仍须纳入容量模型中的大量信号积压 |
| W04 | TIMER、早到SIGNAL、独立等待恢复均有全停后接续 | 生产长时间等待、保留与清理策略按P6验收 |
| W05 | 并行已知失败结清、未知效果保留核查,成功步骤保持 | 业务补偿不属于已确认首版,不冒充平台回滚外部效果 |
| W06 | v1等待时发布不同处理器/输入/时限的v2,实际完成旧实例后继及v2新实例,精确输出、固定版本和原截止保持 | 服务端/SDK滚动兼容仍按P7,不能用定义版本隔离替代 |
| W07 | 已授权任务取消后收集SUCCEEDED/FAILED/CANCELLED/UNKNOWN,含进程全停 | 大量在途取消、外部系统执行失联仍需生产负载和接入方证明 |
| W08 | 同一实例并行结果竞争,后继与汇合仅一次 | 高负载热点实例锁等待在P6测量 |
| W09 | 信号受理/原截止消费者/CANCEL三个事务均进入MySQL锁等待后放行,六种顺序分别覆盖有/无及时信号;迟到信号不胜出,及时信号保留 | 热点负载、长时间消费积压及数据库切换仍按P6 |
| W10 | 同恢复键竞争、旧激活结果、旧信号代次及恢复后全停 | 滚动版本兼容、长期历史保留另按P6/P7 |
| W11 | 同轮重试与PENDING新轮次的存储、SDK及实际HTTP例子 | 渠道峰值与大批量同刻唤醒按P6 |
| W12 | 最大轮次、截止、原轮尝试耗尽拒绝绕过;新例子保留NEEDS_REVIEW | 不把本地时间预算测试换算成生产延迟指标 |
| W13 | PENDING结果/等待和下一轮任务/预算分别覆盖COMMIT前回滚、提交后丢确认;新运行器按原候选恢复,原结果计时及查询预算保持 | 生产数据库失联、切换与容量继续P6 |
| W14 | PAUSE与开始/后继/领取/安全重试的真实事务竞争,双向入队、数据库授权时间、暂停收集结果、恢复任务/尝试数及原截止断言 | 不声称穷尽全部线程交错;高负载锁等待及故障切点继续P6 |
| W15 | 公共SDK暂停后提交任务结果/信号,两原节点全部SIGKILL并Wait退出;TIMER/下一查询轮就绪时间过去后两新节点接管,显式RESUME完成四任务/两轮查询 | 单机数据库下的应用进程故障证据;生产数据库高可用和长停机恢复另按P6 |
| W16 | 原受理时间裁决、在途PENDING结清/冲突核查/全停保留;另有最终信号、旧PENDING重放、下一轮时钟六种真实事务竞争,后继仅一个 | 新结果冲突与旧结果重放分别核验;不声称穷尽调度交错,热点负载继续P6 |
| W17 | 同版本同内容/不同内容、非法定义、SDK丢发布回执恢复 | 旧SDK/服务版本滚动兼容矩阵按P7发布候选核对 |
## 首批独立场景验证记录(历史)
环境:macOS arm64、Go 1.27.1、Docker MySQL 8.4.10,一次性隔离数据库和真实Orbit进程。新例子先用`go run -race`运行,两个命令均退出0;恢复例子的网络断线由本机HTTP服务器真实注入。
标准命令为`make fmt test vet build`及`make integration`。完整标准脚本退出0,23个SDK示例、2个独立业务模块和原进程故障链路均通过。存储组239.651秒、流程进程组48.687秒、Inbox35.613秒、Outbox34.499秒,最后Worker/订阅进程组95.453秒;这些是测试耗时,不是性能指标。
收尾按原计划给轮询例子补入首次提交TASK,该修改晚于上述全量脚本的示例执行。最终两个例子另在新隔离数据库、真实Orbit及`go run -race`下完整重跑,退出0,两个轮询场景均验证submissions=1;随后取得基础fmt/race单元/vet/build退出0。平台服务端和迁移未改动;不将较早的全量日志冒充包含最后这项示例修改。
最终文档检查1162个本地链接、68个JSON块,错误0。数据库升级回归继续确认70个历史外键移除、323个原索引组成部分和任务保留,最终结构外键0。
首次定向脚本省去存储测试后忘记单独执行迁移,bootstrap在发放凭据前拒绝,已修正为先运行orbit-migrate。编译时也纠正了示例误用的来源字段名,正式SDK字段为PollRound。这些修正没有改变平台执行或恢复规则。
## 阶段结论与下一步
1. W06/W09/W14/W15已补真实数据库与公共SDK进程断言,并完成标准全量回归,见[专项回归](phase-4-5-races.md)。原四项缺口已关闭,后续按剩余生产故障推进。
2. W01/W13已补真实COMMIT前后断线,W16已补最终信号/旧PENDING重放/下一轮竞争;本报告原功能表、故障表及两批完整回归共同支持P4/P5平台功能阶段验收。此次完整标准回归结果见[故障边界报告](phase-6-fault-boundaries.md),历史记录不覆盖为新数字。
3. P6已完成上述首批故障工具(包括A04未送达),下一步为统一观测、凭据轮换、历史保留/归档、容量负载、备份恢复与滚动升级;MySQL切换、跨故障域等原门槛继续保留。
4. P7补实际文件转换等仍缺的原场景、SDK版本发布与新接入者全量核对。百万企业支持能力只能根据实际工作负载和目标拓扑验证,当前不作容量承诺。