Files
orbit/docs/api/execution-load.md

7.5 KiB
Raw Blame History

有界任务执行测量

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 初始化,完整参数见鉴权手册。

启动匹配版本的 Orbit 后,在SDK模块目录执行:

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,原始样本见执行测量报告。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流程和长期积压已有独立工具/报告(见定时手册、流程手册和积压报告);仍需要慢消费者/重连风暴、目标硬件资源曲线、复制切换及跨故障域测试,当前样本不能替代这些生产门槛。