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

50 lines
4.6 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。实现和验收范围为内部信号服务与持久化运行器。实例/信号公共HTTP和独立SDK、完整控制与人工恢复仍待交付,持续目标未结束。
## 变化与边界
- 固定目标步骤、激活代次、信号名称/契约、精确操作关联、原因及证据,显式信号授权;每实例历史总上限1024。
- 原键冻结回执,参数冲突拒绝;受理证明与不可变审计核对,不接受修改后的信号参数授权后继。
- SIGNAL早到、等待、按时受理延迟消费、重复与截止处理;暂停收集并持久保存根接续。
- POLL最终信号与查询按原事实时间竞争,PENDING不作为最终结果;在途查询先请求取消并保留许可,未知或冲突转核查。
- Pulse取消逻辑提取为公共内部事务函数,原公共取消权限、幂等和审计边界保留;信号调用前验证流程所有权。
- 迁移000020增加5个Signal字段和1个Wait字段。当前35个实体、301个直接持久化字段声明,中文注释、零外键及禁止级联约束继续执行。
详细规则及升级顺序见[信号文档](../14-workflow-signals.md)。此处CONSUMED表示等待采用了信号,不代表流程成功或外部查询已结束。
## 验证记录
环境:darwin/arm64、Go 1.27.1、Docker MySQL 8.4.10;临时隔离数据库,未访问业务数据库或生产数据库。
| 检查 | 结果 |
| --- | --- |
| 基础格式、单元、竞态、静态检查、构建 | `make fmt test vet build`通过,退出0,包含服务端、独立SDK和业务示例module |
| 信号受理与运行器专项 | 受理4组、运行器20组,连同TIMER/POLL、原流程运行器、Pulse取消、新建结构和v7/v9升级,`-race`通过,51.926秒 |
| 真实v19升级 | 全量存储阶段已通过,3.90秒;原764字节关联、精确内容、已消费证据保留,旧PENDING隔离,当前SIGNAL在原截止回填 |
| 全量隔离MySQL与真实进程/SDK/示例 | 已通过,脚本退出0;全存储172.485秒、流程进程20.127秒、Worker SDK 94.716秒、SDK进程故障93.118秒;19个SDK示例和2个独立业务示例全部通过 |
专项入口:
```sh
go test -race -count=1 -run '^TestIntegration(WorkflowSignalAdmission|WorkflowSignalRuntime|WorkflowSignalUpgrade|WorkflowClock|WorkflowRuntime|WorkerCancellation|SchemaAndConstraints|NoForeignKeysUpgrade|ApplicationResourcesUpgrade)$' -v ./internal/storage/mysql
go build -o /tmp/orbit-signal-test-server ./cmd/orbit
ORBIT_TEST_SERVER_BINARY=/tmp/orbit-signal-test-server go test -race -count=1 -run '^TestIntegrationWorkflowRuntimeProcess$' -v ./internal/storage/mysql
```
必须设置`ORBIT_TEST_MYSQL_DSN`为一次性数据库。未配置环境变量导致跳过时不能记作通过。[全量脚本](../../scripts/test-mysql.sh)创建隔离MySQL并显式构建二进制、再运行实际进程测试。
存储专项覆盖12个并发受理只生成一条信号、12个并发消费者只创建一个后继、早到保存、暂停后接续、按时受理晚消费、真实等待超时、审计故障回滚、原回执冻结、载荷/actor/受理时间篡改进入核查、过期退避不改截止,以及最终信号在轮次间/未开始/执行中到达。执行中的查询分别返回取消、PENDING、相同最终值、未知、已知请求失败及冲突最终值;核查和许可释放按实际结果核验。查询较早完成时,先运行时钟或先运行Inbox都保留查询胜出。
真实进程用例进一步扩展了早到信号在全停期间保存、两个新控制进程激活消费,以及最终信号选中后再强杀全部进程、查询结清入库后由两个新进程恢复赢家的场景。该用例已由实际Orbit二进制执行通过,20.127秒;不是仅重建Go对象或内存快照的模拟。
数据库直接核验外键0、缺少COMMENT的业务字段0;代码301个直接持久化字段声明均有中文注释。文档检查870个本地链接、53个JSON代码块,错误0,业务项目标识检查通过;`git diff --check`通过。v7升级中70个历史外键全部移除,323项原索引组件保留;v20的两个信号索引和赢家唯一索引另行核验定义。
## 仍须完成
1. FAIL_AFTER_SETTLED分支取消与完整结清、实例暂停/继续/取消/人工核查恢复。
2. 实例/步骤/来源/信号/审计HTTP、独立SDK和可运行的端到端通用示例。
3. P6–P7的监控、完整故障矩阵、性能容量、MySQL切换/备份恢复和SDK发布核对。
这些测试不等同于生产高可用、容量或RPO/RTO验收;运行器采用单MySQL持久事务,生产边界继续单独验证。