feat: measure bounded worker execution with durable verification
This commit is contained in:
96
docs/api/execution-load.md
Normal file
96
docs/api/execution-load.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# 有界任务执行测量
|
||||
|
||||
`sdk/go/cmd/orbit-exec-load` 通过公共 Go SDK 运行 HTTP 提交 → WSS Worker 授权/执行/续租/结果确认 → HTTP 读取持久化状态/尝试历史的完整链路。它测量普通 Pulse 任务;`orbit-load` 继续只测受理,两个命令独立。
|
||||
|
||||
## 准备及运行
|
||||
|
||||
使用一次性数据库或专用测试命名空间。凭据需有 `queues:read`、`tasks:submit`、`tasks:read`、`workers:connect`、`workers:consume`,覆盖指定队列。开发测试可通过 `orbit-admin bootstrap ... --worker-access --output /private/execution.credentials.json` 初始化,完整参数见[鉴权手册](authentication.md)。
|
||||
|
||||
启动匹配版本的 Orbit 后,在SDK模块目录执行:
|
||||
|
||||
```sh
|
||||
cd sdk/go
|
||||
export ORBIT_URL='http://127.0.0.1:8080'
|
||||
export ORBIT_CREDENTIALS_FILE='/private/execution.credentials.json'
|
||||
|
||||
# 空处理器的框架路径
|
||||
go run ./cmd/orbit-exec-load \
|
||||
-requests 96 -concurrency 8 -workers 2 -capacity 4 \
|
||||
-durations 0ms -run-timeout 2m
|
||||
|
||||
# 按序号依次使用0ms、100ms、1s的混合任务
|
||||
go run ./cmd/orbit-exec-load \
|
||||
-requests 96 -concurrency 8 -workers 2 -capacity 4 \
|
||||
-durations 0ms,100ms,1s -run-timeout 2m
|
||||
|
||||
# 超过一个租约周期的任务,观察真实续租
|
||||
go run ./cmd/orbit-exec-load \
|
||||
-requests 6 -concurrency 3 -workers 2 -capacity 4 \
|
||||
-durations 35s -run-timeout 2m
|
||||
```
|
||||
|
||||
默认从凭据文件读取token和queue_id,也支持 `ORBIT_TOKEN`、`ORBIT_QUEUE_ID`。环境变量中非空token/queue覆盖文件值;`-queue` 和 `-url` 可覆盖对应环境变量。凭据不作为命令行参数或JSON结果输出。每个Worker均为负载进程中的独立WSS运行器,不是独立主机或故障域;Orbit服务进程保持独立。
|
||||
|
||||
工具读取并输出当前队列配置,不修改队列和应用额度。因此结果包含实际并发/开始速率限制的影响。运行前记录应用额度、服务连接池、数据库配置、CPU/内存限制及数据量,不能用Worker总capacity直接替代队列的有效许可上限。
|
||||
|
||||
## 参数与资源预算
|
||||
|
||||
| 参数 | 默认 | 约束 |
|
||||
| --- | --- | --- |
|
||||
| `-requests` | 100 | 1–10000,独立任务总数 |
|
||||
| `-concurrency` | 8 | 1–128,提交和后续核验两个阶段各自的HTTP并发上限;最多等于任务数 |
|
||||
| `-workers` | 2 | 1–32条独立WSS Worker连接 |
|
||||
| `-capacity` | 4 | 每Worker 1–256,总计最多1024个物理处理器槽 |
|
||||
| `-durations` | `0ms` | 1–16个逗号分隔时长,按序号取模;0–60秒的整毫秒 |
|
||||
| `-timeout` | 5秒 | 单次HTTP请求1毫秒–1分钟,不是任务时限 |
|
||||
| `-run-timeout` | 2分钟 | 整体1秒–1小时;必须比最大模拟时长至少长1秒,仍须为排队留余量 |
|
||||
| `-poll-interval` | 250毫秒 | 每个活跃核验器100毫秒–10秒的查询间隔 |
|
||||
|
||||
整个运行共用截止上下文,结束时所有Worker有界收尾,最多再等5秒。中断或截止停止继续提交/核验,不自动取消、删除已受理任务。未完成任务继续保留原预算和身份;报告失败后不能把它们当作全部未执行。
|
||||
|
||||
每个任务最多一次执行尝试,安全策略为 `RECONCILE_ONLY`。总时限及单次尝试时限等于 `run-timeout`,以数据库首次受理时间计时;客户端整体截止另从本次运行开始计时。提交HTTP不自动重试。Worker沿现有SDK语义重连、续租和恢复控制确认;未知执行不改成明确失败来凑满成功数。
|
||||
|
||||
## 固定身份与核验
|
||||
|
||||
随机 `run_id` 同时进入本次专属处理器名称 `load.exec.{run_id}`、业务键 `orbit-exec-{run_id}`、提交幂等键 `orbit-exec-{run_id}-{sequence六位十进制}` 及输入。序号从0开始,每项输入和预期结果都是 `{run_id, sequence, duration_ms}`。处理器只有可取消等待和回显,不调用文件、数据库或外部业务接口。
|
||||
|
||||
所有提交发起完后,有界核验器读取已确认的任务及尝试。每一项成功必须同时满足:
|
||||
|
||||
- 受理回执身份唯一,队列/处理器/版本/关联键/输入/尝试预算符合本次固定请求。
|
||||
- 任务为 `SUCCEEDED`、`effect_uncertain=false`、`attempt_count=1`,结果匹配预期输入。
|
||||
- 尝试历史恰好一项、没有后续页;属于原任务,代次1、`SUCCEEDED`,授权和结束时间齐全。
|
||||
- 数据库时间满足创建、可执行、领取、授权、结束顺序,任务完成时间与尝试结束时间一致。
|
||||
- 本地处理器对应原任务且该序号恰好调用一次;重复调用及错误输入留在错误计数中。
|
||||
|
||||
成功任务通过HTTP读取持久化事实确认;SDK的 `ReportsConfirmed`、事件通知或处理器返回nil不能替代核验。
|
||||
|
||||
## 报告与错误退出
|
||||
|
||||
标准输出是一行JSON,原始样本见[执行测量报告](../reports/phase-6-execution-load.md)。`complete=true` 才返回退出码0;缺少权限、提交失败/回执未知、读取失败、任务失败/核查、截止、Worker错误或核验不一致均产生不完整报告和非零退出码。
|
||||
|
||||
| 字段 | 含义 |
|
||||
| --- | --- |
|
||||
| `attempted` / `not_submitted` | 实际提交调用数 / 截止前未提交数 |
|
||||
| `accepted` / `admission_errors` | 已核验唯一回执数 / 明确拒绝或受理结果无法确认数;后者不等于数据库中没有任务 |
|
||||
| `verified_success` / `unverified` | 已受理项中最终通过完整核验数 / 其余项数 |
|
||||
| `handler_calls` / `duplicate_invocations` | 本地有效输入处理器调用数 / 同一序号多余调用数 |
|
||||
| `unconfirmed_handler_calls` | 处理器执行了但没有收到有效受理回执的调用数;整个运行仍失败 |
|
||||
| `worker_started` / `worker_reconnects` / `worker_renewals_confirmed` | SDK本进程辅助观测,不代表持久成功数 |
|
||||
| `errors` | 有限错误分类及数量,既有每项错误,也有运行级错误,不应求和为失败任务数 |
|
||||
|
||||
每个耗时分布返回 `count`、`p50_ms`、`p95_ms`、`p99_ms`、`max_ms`,采用最近秩。没有样本时百分位为null。分母分别是:
|
||||
|
||||
| 耗时 | 时钟与分母 |
|
||||
| --- | --- |
|
||||
| `admission` | 本机单调时钟;所有实际提交的HTTP交换,包含失败 |
|
||||
| `queue_wait` | 数据库 `available_at` → `authorized_at`;仅完整核验成功项,包含等待领取及开始授权 |
|
||||
| `authorized_execution` | 数据库 `authorized_at` → `ended_at`;仅完整核验成功项,包含开始确认传输、模拟处理、结果回传至结束事务取时点 |
|
||||
| `task_completion` | 数据库 `created_at` → `completed_at`;仅完整核验成功项 |
|
||||
|
||||
后面三个分布使用同一数据库时钟,避免核验轮询顺序污染执行耗时。时间戳记录事务内取时点,不能测量该取时点之后的COMMIT落盘及确认延迟;这些行最终已持久提交由后续HTTP核验确认。它们依赖数据库墙钟;时间逆序会报告 `TIMESTAMP_MISMATCH`。不完整运行的成功子集存在幸存者偏差,不能与完整样本直接比较。整次墙钟包含预检、读取和Worker收尾,不能拿 `requests / 整次耗时` 声称纯执行吞吐。
|
||||
|
||||
## 回归与生产边界
|
||||
|
||||
`make integration` 在隔离MySQL及真实服务上执行6项混合任务的命令冒烟;`make sdk-check` 检查独立模块并执行测量计算、失败/超时/错配及重复调用测试。
|
||||
|
||||
该工具新增普通任务短/混合/中长执行路径测量能力。当前仍需要定时集中触发、Weave流程、长期积压、慢消费者/重连风暴、目标硬件资源曲线、复制切换及跨故障域测试;当前样本不能替代这些生产门槛。
|
||||
Reference in New Issue
Block a user