fix: bind workflow samples to distinct task execution proofs
This commit is contained in:
@@ -1,41 +1,47 @@
|
||||
# P6 Weave 流程执行测量
|
||||
|
||||
验证日期:2026-09-20(UTC 运行时间记录为 2026-09-19 18:51)。这是一次性 MySQL 8.4 容器中的隔离正确性与阶段延迟样本,不是生产容量或高可用验收。
|
||||
验证日期:2026-09-20,最终运行 UTC 06:05–06:06。一次性 MySQL 8.4.10 中的隔离正确性与阶段耗时样本,P6/P7 仍进行中,不作为生产容量或高可用验收。
|
||||
|
||||
## 测量内容
|
||||
## 本轮修正
|
||||
|
||||
`orbit-workflow-load` 通过独立 Go SDK 完成以下链路:
|
||||
原测量按每个实例的处理器总调用数核对两个分支,对重复分支、任务身份和本次发布版本的约束不足;输出中序号0还可能由缺失字段被解码为零值。本轮改为精确链路核对:
|
||||
|
||||
1. 只读检查队列状态。
|
||||
2. 创建一个新的稳定定义并发布不可变 `v1`。
|
||||
3. 启动 24 个独立实例,每个实例使用自己的幂等键和业务键。
|
||||
4. 每个实例执行一个包含 `left`、`right` 两个静态分支的 `PARALLEL` 节点;两个分支各创建一个 `TASK`。
|
||||
5. 两个真实 WSS Worker(每个容量4)回显固定输入。
|
||||
6. 对每个成功实例读取步骤、任务、唯一尝试、流程任务来源和最终输出,核对实例固定版本及来源归属。
|
||||
- 发布回执必须匹配命名空间、定义身份、完整规范;实例绑定本次发布的不可变版本ID,输入和首次绝对截止不变。
|
||||
- 步骤精确为 `pair:PARALLEL`、`left:TASK`、`right:TASK`,全部成功,步骤和激活身份唯一;左右分支必须关联不同任务。
|
||||
- 任务的队列、命名空间、处理器、策略、输入/结果、固定截止与时间顺序一致,每任务恰有一个成功尝试;来源匹配该实例、版本、步骤键和激活。
|
||||
- 每个已核验任务对应本地同一尝试的一次调用。一个分支执行两次不能抵充另一个分支;尚不能关联的调用单独报告。
|
||||
- 精确JSON字段集合拒绝缺字段、null、重复键、大小写别名和尾随JSON,序号0也必须明确提供。
|
||||
- 发布的流程及任务时限使用 `run-timeout`,移除原工具中未公开的30秒截断;报告增加每个启动请求的原键、实例ID、受理错误及核验标记。
|
||||
|
||||
处理器只回显 `run_id` 和 `sequence`,没有外部副作用;启动调用和流程读取都没有 SDK 自动重试。流程定义把任务尝试上限固定为1,响应不明时保留原运行身份。
|
||||
此前24实例记录没有形成最终源码与所运行二进制的可靠对应,不能用于证明本轮实现。当前原始样本已由**重新构建的二进制**运行并替换旧证据;旧内容可从Git历史追溯。本轮环境清单同时保存源码、实际二进制及原始结果哈希,构建后没有修改这些源码。
|
||||
|
||||
## 实际结果
|
||||
|
||||
| 项目 | 结果 |
|
||||
| --- | ---: |
|
||||
| 计划/实际启动调用 | 24 / 24 |
|
||||
| 唯一受理实例 | 24 |
|
||||
| 持久化核验成功 | 24 |
|
||||
| 未核验实例 | 0 |
|
||||
| 处理器调用 | 48(每实例两个分支) |
|
||||
| 重复调用 | 0 |
|
||||
| Worker 启动任务数 | 48 |
|
||||
| 错误分类 | 空 |
|
||||
| 完成标记 | `true` |
|
||||
| 启动耗时 P50 / P95 / P99 | 44.767208 / 49.584459 / 56.462333 ms |
|
||||
| 服务端流程完成耗时 P50 / P95 / P99 / Max | 7898.658 / 13838.444 / 14788.909 / 14788.909 ms |
|
||||
工具通过独立 SDK 创建定义、发布固定 `v1`、启动流程,用2个真实 Worker回显固定输入,随后逐项读取流程、步骤、任务、尝试与来源。任务最多一次尝试、`RECONCILE_ONLY`,处理器无外部副作用。任何写请求都不由工具自动重试,队列额度只读。
|
||||
|
||||
原始 JSON:[sample-24.json](data/phase-6-workflow-load/sample-24.json),工具链和源码摘要见[环境清单](data/phase-6-workflow-load/environment.json)。执行工具和字段语义见[流程负载测量手册](../api/workflow-load.md)。
|
||||
| 样本 | 请求/受理 | 持久核验成功/未核验 | 本地调用 | 重复/未确认调用 | 完整/退出码 |
|
||||
| --- | ---: | ---: | ---: | ---: | --- |
|
||||
| 24实例,90秒截止 | 24/24 | 24/0 | 48 | 0/0 | true / 0 |
|
||||
| 100实例,90秒截止 | 100/100 | 100/0 | 200 | 0/0 | true / 0 |
|
||||
| 24实例,2秒截止 | 24/24 | 2/22 | 4 | 0/0 | false / 1 |
|
||||
|
||||
## 环境和边界
|
||||
原始结果:[24实例](data/phase-6-workflow-load/sample-24.json)、[100实例](data/phase-6-workflow-load/sample-100.json)、[截止负例](data/phase-6-workflow-load/deadline-24.json)。两组正常样本错误集合为空;负例报告 `RUN_TIMEOUT=1`、`VERIFY_TIMEOUT=22`,22个实例保留原身份且未算成功。截止后只停止本地 Worker,不取消服务器实例;该快照不证明未核验工作已撤销或最终失败。
|
||||
|
||||
- 负载工具:Go `1.25.14`,Linux `arm64`;请求并发6,Worker 2×4,轮询100ms,单次 HTTP 5s,整次样本90s。
|
||||
- 服务端:一次性 Docker MySQL `8.4`,通过当前迁移器初始化;结束时 `orbit-admin verify` 输出 `schema_version=28`、`migration_count=28`、`foreign_key_count=0`、`required_index_count=6`、`complete=true`。
|
||||
- 队列为只读测试资源,`max_concurrency=4`、`rate_per_second=10`;队列额度和数据库结构没有因测量修改。
|
||||
- 该样本证明流程发布、并行推进、Worker 执行、持久化回执和来源核对在此环境可复现;它不证明多节点吞吐、跨故障域恢复、生产连接池容量、RPO/RTO、备份介质或市场化部署 SLA。
|
||||
| 正常样本 | 受理往返P50/P95/P99 | 数据库实例创建至完成P50/P95/P99 |
|
||||
| --- | --- | --- |
|
||||
| 24实例 | 47.694 / 56.059 / 64.540ms | 7874.268 / 12805.768 / 12816.559ms |
|
||||
| 100实例 | 65.156 / 70.222 / 71.857ms | 23486.790 / 39126.668 / 42091.211ms |
|
||||
|
||||
100实例样本中最长流程持久耗时42101.309ms,超过旧工具的30秒隐藏上限,在此次90秒配置下仍正确完成。分布只统计完整核验成功实例,不混入客户端轮询等待;该观察不能推导目标生产吞吐。
|
||||
|
||||
## 环境、回归及复现
|
||||
|
||||
单节点 Orbit、一次性 MySQL 8.4.10,1个负载进程中2个Worker。队列并发4、每秒授权10,工具不改额度。24/100正常组请求并发分别6/8,每Worker容量4;负例并发6、每Worker容量2。每次HTTP截止5秒,轮询100毫秒。指标关闭,容器共享本机Docker VM,无独占CPU/内存限制;Go进程与MySQL共享网络命名空间,仅回环通信,无宿主机发布端口。
|
||||
|
||||
实际工具链为 **Go 1.25.14 Linux arm64**,通过临时modfile使用;仓库声明的Go 1.27.1未改。SDK全模块 `go test -race ./...`、`go vet ./...`、`go build ./...` 通过,见[检查日志](data/phase-6-workflow-load/sdk-check.txt)。新增回归覆盖:发布版本替换、精确步骤/激活/任务身份、错误任务策略/队列/截止、缺失/额外尝试、错误来源和时间顺序、并发本地调用、同一分支重复不能抵充第二分支,以及序号0的严格字段解析。
|
||||
|
||||
真实样本后 `orbit-admin verify` 确认schema version28、28条迁移记录、6个必需索引及**外键0**,见[结构核验](data/phase-6-workflow-load/schema.json)。本轮没有修改数据库模型或迁移。
|
||||
|
||||
精确参数、工具链、资源和源码/二进制/结果哈希见[环境清单](data/phase-6-workflow-load/environment.json)。按[调用手册](../api/workflow-load.md)准备一次性数据库和带 `workflow-access`、`workflow-run-access`、`worker-access` 的隔离凭据,使用当前源码重新构建工具,再运行环境清单中的三组参数;退出码应为0、0、1。标准 `scripts/test-mysql.sh` 保留6实例回归入口,本轮未重跑整份集成脚本。
|
||||
|
||||
本批不覆盖目标Go 1.27.1标准全量、跨标签SDK/服务端兼容矩阵、长期积压和资源曲线、多节点吞吐、跨故障域恢复、生产连接池容量、RPO/RTO或发布审批;这些门槛继续按P6/P7完成。
|
||||
|
||||
Reference in New Issue
Block a user