feat: persist workflow signals and arbitrate poll completion
This commit is contained in:
49
docs/reports/phase-4-signals.md
Normal file
49
docs/reports/phase-4-signals.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# 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持久事务,生产边界继续单独验证。
|
||||
Reference in New Issue
Block a user