feat: add bounded workflow execution measurement

This commit is contained in:
2026-09-20 02:56:41 +08:00
parent 1dfc7e4234
commit 71c33eae18
15 changed files with 849 additions and 4 deletions

View File

@@ -0,0 +1,40 @@
{
"date_local": "2026-09-20",
"timezone": "Asia/Shanghai",
"test_go": "go1.25.14",
"declared_go": "1.27.1",
"temporary_modfile": true,
"mysql": "8.4.10",
"docker_vm_cpus": 12,
"docker_vm_memory_bytes": 12529274880,
"architecture": "arm64",
"orbit_processes": 1,
"mysql_nodes": 1,
"worker_processes": 1,
"worker_connections_normal": 2,
"worker_capacity_each": 4,
"workflow_requests": 24,
"workflow_concurrency": 6,
"queue_max_concurrency": 4,
"queue_rate_per_second": 10,
"poll_interval_ms": 100,
"http_timeout_ms": 5000,
"run_timeout_ms": 90000,
"metrics_enabled": false,
"cpu_memory_limits": "No dedicated limits; shared local Docker VM, other workloads possible",
"fresh_disposable_database": true,
"network": "Go runner shares MySQL container network namespace; loopback HTTP/WSS and MySQL",
"schema_verification": {
"schema_version": 28,
"migration_count": 28,
"foreign_key_count": 0,
"required_index_count": 6,
"complete": true
},
"source_sha256": {
"sdk/go/cmd/orbit-workflow-load/main.go": "05a160431b26d91ab430392b23f4fcf76bd23dfeb21bd2047fe8372c17e93fe5",
"sdk/go/cmd/orbit-workflow-load/measure.go": "1a31d06d3a9e483aee5aca115f7f1230649e050a0bddae1770659fe2735a99a3",
"sdk/go/cmd/orbit-workflow-load/measure_test.go": "42e710139f515aa339b5684107d00fcb413688e7512fc4c36ebfe56776ad41a1",
"sdk/go/cmd/orbit-workflow-load/report.go": "701a27a3f4f56cf9566fbcf97fba8024ced36b32754f4a5dcdae4646a2a4b24a"
}
}

View File

@@ -0,0 +1 @@
{"run_id":"e4f954ba8507b35fda519f197c301304","go_version":"go1.25.14","goos":"linux","goarch":"arm64","started_at":"2026-09-19T18:55:18.343555301Z","admission_finished_at":"2026-09-19T18:55:18.553077926Z","finished_at":"2026-09-19T18:55:33.351706711Z","requests":24,"concurrency":6,"workers":2,"capacity_per_worker":4,"run_timeout_ms":90000,"poll_interval_ms":100,"http_timeout_ms":5000,"queue":{"max_unfinished_tasks":100000,"unfinished_tasks":"0","id":"6ba1b31c689aa7249f9f41bc873b3a6f","namespace_id":"5dd105847384f7782a1923aa4288508e","name":"workflow","paused":false,"max_concurrency":4,"rate_per_second":10,"revision":"1"},"definition_id":"5650b9f2a6838263ea3222dd879f6540","version_id":"73608bdb26c948a98700d101c1f5e787","attempted":24,"not_submitted":0,"accepted":24,"admission_errors":0,"verified_success":24,"unverified":0,"handler_calls":48,"duplicate_invocations":0,"worker_started":48,"worker_reconnects":0,"worker_renewals_confirmed":0,"admission":{"count":24,"p50_ms":44.767208,"p95_ms":49.584459,"p99_ms":56.462333,"max_ms":56.462333},"completion":{"count":24,"p50_ms":7898.658,"p95_ms":13838.444,"p99_ms":14788.909,"max_ms":14788.909},"errors":{},"complete":true}

View File

@@ -0,0 +1,41 @@
# P6 Weave 流程执行测量
验证日期:2026-09-20(UTC 运行时间记录为 2026-09-19 18:51)。这是一次性 MySQL 8.4 容器中的隔离正确性与阶段延迟样本,不是生产容量或高可用验收。
## 测量内容
`orbit-workflow-load` 通过独立 Go SDK 完成以下链路:
1. 只读检查队列状态。
2. 创建一个新的稳定定义并发布不可变 `v1`。
3. 启动 24 个独立实例,每个实例使用自己的幂等键和业务键。
4. 每个实例执行一个包含 `left`、`right` 两个静态分支的 `PARALLEL` 节点;两个分支各创建一个 `TASK`。
5. 两个真实 WSS Worker(每个容量4)回显固定输入。
6. 对每个成功实例读取步骤、任务、唯一尝试、流程任务来源和最终输出,核对实例固定版本及来源归属。
处理器只回显 `run_id` 和 `sequence`,没有外部副作用;启动调用和流程读取都没有 SDK 自动重试。流程定义把任务尝试上限固定为1,响应不明时保留原运行身份。
## 实际结果
| 项目 | 结果 |
| --- | ---: |
| 计划/实际启动调用 | 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 |
原始 JSON:[sample-24.json](data/phase-6-workflow-load/sample-24.json),工具链和源码摘要见[环境清单](data/phase-6-workflow-load/environment.json)。执行工具和字段语义见[流程负载测量手册](../api/workflow-load.md)。
## 环境和边界
- 负载工具: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。

View File

@@ -8,7 +8,7 @@
| --- | --- | --- |
| 服务端单元与竞态 | Docker `golang:1.25`,临时 modfile;`GOWORK=off go test -race ./...` | PASS |
| 服务端 vet | Docker `golang:1.25`;`GOWORK=off go vet ./...` | PASS |
| SDK 竞态、vet、构建 | Docker `golang:1.25`;SDK 全 module、全部示例和 `orbit-load` | PASS |
| SDK 竞态、vet、构建 | Docker `golang:1.25`;SDK 全 module、全部示例、`orbit-load`、`orbit-exec-load` 和 `orbit-workflow-load` | PASS |
| 当前协议门禁 | `make protocol-check` | PASS,当前 v1 契约同步 |
| 外键迁移防回归 | `TestPostRemovalMigrationGuard`;服务端迁移运行时校验 | PASS;000008 以前仅保留兼容清理历史,后续迁移在执行前拒绝引用约束 DDL |
| MySQL 存储集成 | MySQL 8.4.10,一次性容器;`go test -race -run Integration -skip 'TestIntegration(WorkflowCommitFaults\|CredentialCommitFaults)$'` | PASS,210.893 秒;包含空库无外键基线、v7升级、Pulse/Weave/API/观测/恢复与W16竞争 |
@@ -18,6 +18,7 @@
| SDK 应用配额子进程故障 | 独立双命名空间应用配额凭据;共享网络命名空间;`TestIntegrationWorkerProcessApplicationBackpressure` | PASS,1.069 秒;重启后共享额度、原回执和跨命名空间背压保持 |
| Orbit HTTP/metrics 子进程 | 同一共享网络命名空间;`TestIntegrationMetricsProcess`;metrics 启用/禁用各一组 | PASS,3.081 秒;监听隔离、隐私、后台采样和优雅退出均通过 |
| 真实Worker执行测量 | `orbit-exec-load`;最终短/混合/中长及截止不足四组,环境及原始JSON见[测量报告](phase-6-execution-load.md) | 96+96+6项全部逐项核验,长任务18次续租;24项截止负例按预期非零退出。SDK全模块竞态/vet/build通过,生产容量未验收 |
| 真实Weave流程测量 | `orbit-workflow-load`;24实例、固定版本双分支并行,原始JSON见[流程测量报告](phase-6-workflow-load.md) | 24/24实例成功,48/48任务尝试与来源、输出逐项核验,重复调用0;生产容量未验收 |
## 当前环境仍未覆盖