5.8 KiB
P4 子项:定义校验与不可变发布
日期:2026-09-18。本子项已通过验收。范围是研发定义格式、静态校验、定义创建、版本发布/读取及独立SDK。实例启动、推进、信号/时间等待、暂停/恢复和轮询执行仍未实现;本报告不构成P4整体或生产高可用验收。
实现
weave/definition提供schema_version=1结构及类型契约,六类节点、词法引用、条件、并行汇合和有限预算校验。不会执行上传源码。- 创建/发布/读取四个HTTP路由,两个显式权限与
--workflow-access初始化标志。API严格匹配字段,映射值递归检查;仅DSL常量允许显式null,普通任务参数限制保持不变。 - 复用现有两张定义表,未新增迁移、外键、级联或数据库依赖。发布在应用→身份→定义→队列顺序下串行化,版本/revision/审计/回执同事务。中文字段注释随代码保留。
- 同键绑定完整命令,同版本按规则摘要比较;数字使用精确JSON规范化。读取核对原文及结构摘要,损坏或悬空关联拒绝;重复请求仍检查当前队列权限。
- 独立SDK强类型定义、引用构建及四个客户端方法;完整六类节点发布例子和API、格式、场景同步。
回归证据
环境:macOS arm64,Go 1.27.1;Docker隔离MySQL 8.4.10,随机秘密/回环端口,由脚本创建并清理临时容器,不连接已有业务库。
| 检查 | 结果 |
|---|---|
| make fmt / test(race)/ vet / build | 通过;覆盖服务端、SDK与独立Inbox/Outbox模块 |
| DSL定向单测 | 顺序/分支/并行类型与作用域、禁用前向/跨分支引用、默认路径、策略完整性、轮次与尝试预算、状态完整分组、深度/数量上限、精确数值与非变更检查通过 |
| HTTP严格JSON | 嵌套map大小写别名/未知字段/重复键/null集合拒绝;DSL显式null常量可用,普通任务null仍拒绝 |
| 数据校验模糊测试 | 2个并行worker、10秒目标,15699次执行,通过(工具耗时11.278秒) |
| 真MySQL发布定向回归 | TestIntegrationWorkflowDefinitions -count=3通过,总12.756秒;包含并发、权限、无外键关联、回滚、损坏及数量上限 |
| 真HTTP提交后回执丢失 | 新SDK集成回归通过,1.314秒;服务确认201后代理断开连接,首次调用明确报错,原键重报返回同一版本,revision不重复增长 |
| 六类节点可运行发布例子 | 通过;v1/v2发布及旧版读取,revision=3、steps=8、max_concurrency=2、max_task_attempts=13;没有启动实例 |
| 独立SDK依赖 | GOWORK=off列出依赖,不包含服务端internal/model/platform/pulse/weave、MySQL或ORM |
| 完整隔离链路 | scripts/test-mysql.sh终态退出0;所有19个SDK例子及独立Inbox/Outbox两个例子通过,临时容器已清理 |
并发用例以12个调用竞争6个幂等身份,均取得同一不可变版本,只有一次新发布;随后验证等值小数重报、相邻大整数内容冲突、v2不改变v1、审计次数与父revision,数据库触发器拒绝直接UPDATE。发布不产生Pulse任务。
权限用例覆盖默认凭据无定义权限、原回执队列权限收回、跨命名空间队列/定义、不存在的父定义/队列、手工删除关联后的拒绝。真实数据库断言外键为0。
故障用例通过隔离库审计写入失败使版本/父revision/幂等身份全部回滚,再用原键成功发布;另外新增损坏摘要记录及删除父记录,确认读取失败。100个定义/100个版本上限真实由API填满,达到上限仍恢复旧回执。
首次完整回归在发布人读取上发现VARCHAR文本标识被当作BINARY ID扫描;修正为文本读取后再校验ID。三次定向回归已覆盖修正。本报告保留此失败记录,未将此前未到达的SDK链路视为通过。
最终完整回归中,存储集成108.239秒(定义子项2.42秒),Worker SDK91.133秒,计划5.782秒,队列4.458秒,批量1.378秒,查询1.335秒,订阅管理33.363秒,事件消费52.103秒,任务恢复3.418秒,定义SDK1.314秒;独立Inbox35.669秒、Outbox33.839秒,应用额度1.481秒。10个SDK进程故障父用例全部通过,总95.274秒,其中重试全停恢复四场景33.10秒;独立Inbox/Outbox另各有一个进程故障父用例。本次全链路零失败,已确认终态退出及容器清理,没有以日志片段或等待超时替代完成结论。
复现:make fmt test vet build、make integration;定向用例为go test -race -count=3 -run '^TestIntegrationWorkflowDefinitions$' ./internal/storage/mysql(只在隔离库设置ORBIT_TEST_MYSQL_DSN)。SDK定义用例在全量脚本中使用专门签发的流程权限运行。最后完整回归后仅补文档证据,没有修改运行代码。
后续边界
P4下一步是启动实例、固定版本与输入、同事务创建首批任务、内部事件接续和有界推进;继而交付顺序/条件/并行、信号与持久化定时等待。P5补齐轮询运行、门控、取消及有证据人工恢复。现在发布格式支持节点,不等于节点运行器已存在。
启动时必须再次核对定义版本、当前权限、队列与实际运行参数;JSON来源可能为null或超出Pulse字段限制,不能以静态校验代替运行校验。数据库列、已保存规则和SDK版本兼容都需要进入后续升级回归。
独立发布操作的数据库COMMIT回执丢失尚未单独注入;已有回滚及HTTP提交后回执丢失场景不能替代全部存储故障。定义列表、删除/归档、配置化额度、凭据轮换、容量、MySQL故障切换、备份和滚动升级继续按P6–P7处理;不承诺未经验证的生产吞吐和可用性。