feat: add bounded admission load tool

This commit is contained in:
2026-09-19 23:43:09 +08:00
parent 7766b0b710
commit 3954efef70
9 changed files with 450 additions and 0 deletions

View File

@@ -62,6 +62,7 @@ P4/P5定时等待与后续查询轮次的实现及回归记录见[时钟报告](
2. 已实现[基础运行观测](api/observability.md)及[有界业务状态与事件采样](reports/phase-6-business-observability.md):HTTP/WS、数据库连接池、后台批次、固定任务/交付/流程/Inbox状态计数、最近事件类别、终态耗时样本、固定事件阶段耗时、最早年龄、截断/新鲜度指标和可离线验证的告警规则;独立采集监听默认关闭,固定指标目录拒绝动态标签;发布前只读结构核验由[`orbit-admin verify`](api/operations.md)提供。仍需端到端外部效果延迟、全局持久吞吐、Inbox从事件产生到推进完成的精确阶段延迟、全局发送队列、多节点聚合及生产采集/通知验证。
3. 已补齐受保护管理环境中的固定凭据操作文件、轮换、撤销、幂等回执和脱敏管理审计;轮换保留授权绑定并要求新令牌重新建立会话,撤销允许在停用范围内执行且不改写历史记录。仍需补齐提交不明故障切点、多节点安全重绑演练、凭据最小权限配置核对和生产密钥托管/审计演练。
4. 已补[`orbit-admin retention inventory`](api/retention.md)只读盘点和[阶段报告](reports/phase-6-retention-inventory.md),能区分过期幂等、确定终态、未知效果、未终结流程、已确认/未确认交付、已消费/未消费Inbox、事件和审计规模;它不执行归档或删除。后续仍需评审各类保留周期、归档格式、受保护记录核对,再执行备份恢复、兼容升级和六类容量负载。未确认交付、有效幂等身份、当前/历史执行证据和未终结流程不能被普通清理破坏。生产HA及RPO/RTO继续按实际拓扑验证,不缩减为本机多进程检查。
5. 已补[`orbit-load`](api/load.md)有界受理负载工具:固定请求形状、并发上限、每请求超时、无自动重试、延迟百分位和有限错误分类;已完成一次隔离 MySQL + HTTP 小样本实测,证据见[负载报告](reports/phase-6-load.md)。标准 Go 1.27.1 隔离回归仍需在工具链恢复后复跑;该工具只提供受理层测量,真实 Worker/流程/数据库拓扑容量仍需独立报告。
### P3 功能范围核对

View File

@@ -22,6 +22,7 @@
| 凭据校验、初始化、固定操作文件轮换/撤销与回执重放 CLI | P1/P6 已实现;不提供公网管理路由,测试专用提交不明切点已回归 | [鉴权](authentication.md)、[凭据报告](../reports/phase-6-credentials.md) |
| `orbit-admin verify` 发布前结构核验 | 已实现只读迁移、零外键和 000026–000028 固定索引检查 | [运维核验](operations.md) |
| `orbit-admin retention inventory` 保留清单 | 已实现带 UTC 截止时间的只读盘点;不执行归档、删除或权限变更 | [保留清单](retention.md) |
| `sdk/go/cmd/orbit-load` 有界受理负载工具 | 已实现固定并发、无自动重试、延迟百分位和错误分类;只用于隔离环境 | [负载工具](load.md) |
| `/v1/worker/connect` | P2 已实现并通过阶段验收 | [Worker 契约](worker.md)、[Schema](worker-schema.md) |
| 任务相对延迟 `delay_ms` | 已实现数据库计时、原键恢复与实际执行例子 | [任务接口](tasks.md)、[延迟示例](../examples/delayed-task.md) |
| 任务冻结策略与 Worker `retryable` | P3 安全重试已实现 | [安全重试](retries.md) |

35
docs/api/load.md Normal file
View File

@@ -0,0 +1,35 @@
# 有界受理负载工具
`orbit-load` 是独立 Go SDK module 中的受理负载工具,用于在隔离环境测量 HTTP 受理请求的延迟分布。它只提交带独立幂等键的任务,不启动 Worker、不执行业务副作用、不自动重试,也不把测量结果解释为生产吞吐或租户容量保证。
## 运行
先为专用测试命名空间准备凭据,再运行:
```sh
cd sdk/go
ORBIT_URL='http://127.0.0.1:8080' \
ORBIT_CREDENTIALS_FILE='/private/orbit-load.credentials.json' \
go run ./cmd/orbit-load \
-requests 1000 \
-concurrency 32 \
-timeout 10s
```
也可以直接传 `-url`、`-token` 和 `-queue`。命令拒绝非 32 位小写十六进制队列 ID,默认上限是 100000 次请求和 1024 个并发请求;并发数超过请求数时自动降到请求数。每次请求的超时独立计算,超时或 HTTP 错误不会再次提交。
每个任务使用形如 `orbit-load-{run_id}-{sequence}` 的幂等键,输入只包含本次运行标识和序号,处理器默认为 `load.noop`,任务尝试预算固定为 1。命令不会删除生成的任务;测试必须使用一次性数据库或专用命名空间,结束后按保留策略处理,不能直接对生产命名空间运行。
## 输出
标准输出是一行 JSON:
```json
{"started_at":"2026-09-19T00:00:00Z","finished_at":"2026-09-19T00:00:02Z","requests":100,"concurrency":8,"success":100,"errors":0,"p50_ms":11.2,"p95_ms":24.7,"p99_ms":31.4,"max_ms":35.1}
```
`p50_ms`、`p95_ms`、`p99_ms` 和 `max_ms` 统计所有请求(包括失败请求)的端到端 HTTP 交换耗时,百分位采用最近秩;`error_codes` 只保留有限错误分类,例如 `TIMEOUT`、`TRANSPORT`、`HTTP_409` 或服务端稳定错误码,不输出令牌、请求体或内部错误文本。存在失败请求时仍输出报告,并以非零状态退出。
## 解释边界
这项工具固定的是客户端请求数、并发和消息形状,不能替代以下验证:真实 Worker 执行吞吐、定时触发、流程推进、数据库锁等待、复制延迟、磁盘与网络 I/O、故障恢复、跨主机拓扑或长时间积压。正式容量报告必须同时记录硬件、MySQL 拓扑、连接池、数据量、任务时长、结果大小、故障注入和积压清空时间,并将本工具结果与其他阶段指标分开。

View File

@@ -0,0 +1,28 @@
# P6:受理层有界负载工具
验证日期:2026-09-19。本批新增 `sdk/go/cmd/orbit-load`,用于隔离环境测量任务受理 HTTP 交换耗时。工具固定请求并发上限和每请求超时,使用独立幂等键,不自动重试、不启动 Worker、不执行外部副作用;失败仍输出报告并以非零状态退出。它不构成生产容量、可用性或百万租户承诺。
## 实现边界
- 请求数限制为 1–100000,并发限制为 1–1024;每次请求最多一个 HTTP 提交。
- 默认处理器为 `load.noop`,输入只包含随机运行标识和序号,任务尝试预算为 1,避免把测试逻辑误当业务处理器。
- 输出成功数、错误分类、p50/p95/p99/最大耗时;百分位采用最近秩,错误分类不包含令牌、请求体或内部错误文本。
- 工具不清理生成任务,运行前必须使用一次性数据库或专用命名空间;正式容量测试还需配套 Worker、流程、数据库锁等待、积压恢复和拓扑故障测量。
## 隔离实测
环境:macOS arm64 主机,Docker MySQL 8.4,已有 Orbit 服务二进制,负载命令使用 Go 1.25 兼容 modfile 交叉编译为 darwin/arm64;数据库和任务容器在测试结束后销毁。该次只验证工具与受理链路,不能替代项目要求的 Go 1.27.1 标准全量回归。
命令参数:`requests=24`、`concurrency=4`、`timeout=5s`,独立命名空间和队列,未启动 Worker。
实际输出:
```json
{"started_at":"2026-09-19T15:39:43.724491Z","finished_at":"2026-09-19T15:39:43.953625Z","requests":24,"concurrency":4,"success":24,"errors":0,"p50_ms":32.179459,"p95_ms":61.578333,"p99_ms":70.748416,"max_ms":70.748416}
```
结果证明 24 次独立 HTTP 受理均成功且没有错误分类;延迟数值只属于本次主机、连接、数据量和请求形状,不能外推到生产。Go 1.27.1 工具链恢复后,标准 `scripts/test-mysql.sh` 会再次执行相同负载样本并把输出纳入全量日志。
## 未完成的生产验收
仍需在固定硬件和目标拓扑中补充短/中/长任务混合、Worker 连接与重连、定时集中触发、流程推进、慢消费者、长期积压、数据库锁等待、复制延迟、故障切换、备份恢复及容量余量测试;这些结果必须与本工具的受理层样本分开记录。