Files
orbit/docs/reports/phase-6-schedule-load.md

43 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P6 定时集中触发测量
日期:2026-09-20。本批新增独立 SDK 命令 `orbit-schedule-load`,完成多个固定间隔计划同一时刻触发、真实 Worker 执行和持久结果核验。P6/P7 仍进行中;样本不作为生产容量或高可用结论。
## 已实现与实际检查
计划先暂停创建再恢复,固定起止/间隔、版本 1、UTC 时区快照、CATCH_UP/PARALLEL;每任务只有一次尝试。工具核对预期时间槽、触发唯一性、任务身份/模板/结果、成功尝试和时间顺序、固定来源及本地单次调用,并等待计划耗尽。所有退出路径执行有限 Worker 收尾和计划暂停;传输不明不换键重试,保留原操作身份。
初次真实连接发现工具误把 API `v1` 当成时区快照标识,修正为保存服务端返回的具体标识和版本生效时间,后续读取核对不变。下表和原始文件全部来自修正后**重新构建并运行**的二进制;首次失败的创建发生在另一已清理的一次性数据库,不计入最终样本。
SDK 全模块 `go test -race ./...`、`go vet ./...`、`go build ./...` 通过,完整依赖图没有服务端或 MySQL 驱动依赖。新增单测覆盖等待不算成功、重复轮询不重复计数、错配输入/来源/历史/时间、跨计划重复任务、本地并发重复调用、暂停明确冲突与传输不明的处理差异、原时区快照/生效时间不变及部分分母。标准 `scripts/test-mysql.sh` 已接入工具编译和 2×3 触发样本,脚本语法检查通过;本批没有重新跑整份标准集成脚本。
## 环境与结果
一次性 MySQL 8.4.10,1 个 Orbit 进程,1 个测量进程中 2 个 Worker 连接。共享本机 Docker VM,12 个 CPU、12,529,274,880 字节内存,无独占资源额度;其他工作负载可能影响结果。队列并发上限 4、每秒开始授权上限 10,工具未修改配置;指标监听关闭。Go/MySQL 容器共享网络命名空间,仅本机回环通信,无宿主机发布端口。
实际工具链是 **Go 1.25.14 Linux arm64**,通过临时 modfile 使用,仓库声明的 Go 1.27.1 未改。本批不能替代正式工具链全量验收。精确配置、源码/二进制哈希、退出码和原始文件哈希见[环境清单](data/phase-6-schedule-load/environment.json),SDK 输出见[检查日志](data/phase-6-schedule-load/sdk-check.log)。
| 样本 | 预期触发 | 已观察/生成任务 | 已核验成功 | 本地调用/重复 | 结果 |
| --- | ---: | ---: | ---: | ---: | --- |
| 4计划×6次,1秒间隔 | 24 | 24/24 | 24 | 24/0 | `complete=true`,退出0 |
| 32计划×4次,1秒间隔 | 128 | 128/128 | 128 | 128/0 | `complete=true`,退出0 |
| 2计划×12次,1秒间隔,整次仅5秒 | 24 | 6/6 | 2 | 2/0 | `RUN_TIMEOUT`,`complete=false`,退出1 |
原始结果:[24次](data/phase-6-schedule-load/sample-24.json)、[128次](data/phase-6-schedule-load/sample-128.json)、[截止负例](data/phase-6-schedule-load/deadline-24.json)。正常组各有两个 Worker,每个容量4;负例每个容量2。正常组预留5秒设置,整体截止90秒;负例预留1秒设置,整体截止5秒。每次HTTP截止5秒,轮询100毫秒。
| 正常样本 | 触发延迟P95 | 排队至授权P95 | 授权执行P95 | 计划时间至完成P95 |
| --- | ---: | ---: | ---: | ---: |
| 24次 | 2005.396ms | 2126.701ms | 21.111ms | 4067.032ms |
| 128次 | 1964.089ms | 14277.183ms | 20.414ms | 16200.649ms |
32 个同时触发的计划在现有并发/速率限制下形成排队,上表记录这次现象;未做控制变量或持续资源采样,不能据此判定瓶颈或推导生产吞吐。耗时分布均由持久时间计算,分母分别为24和128,只包含已核验成功任务。
负例保留18个未观察到的计划触发点、4个已经触发但未核验成功的任务,没有把超时隐藏为成功。`pause_confirmed` 在全部计划中为真;暂停不取消已生成任务。测量后独立数据库回读共有38个计划且全部暂停、158个触发记录、158个任务,其中154个成功,触发记录间重复任务数0;其余4个任务没有被该样本核验为成功,不能推测为已撤销或最终失败。见[数据库快照](data/phase-6-schedule-load/database.json)。
`orbit-admin verify` 独立确认 schema version28、28条迁移记录、6个必需索引和**实际外键0**,见[结构核验](data/phase-6-schedule-load/schema.json)。本批未修改数据库模型或迁移;不可变旧迁移仍保留历史外键及其前向清理记录。
## 复现与下一步
按[工具手册](../api/schedule-load.md)创建隔离命名空间/队列,签发 Worker 与计划权限,依次运行环境清单中的三组参数;前两组应退出0,第三组应退出1并报告剩余分母。使用新创建的一次性MySQL、当前源码构建的服务端和测量工具,最终执行 `orbit-admin verify`。校验时不得把源码修改后的哈希附到之前构建的二进制结果。
当前只验证同节点、固定间隔、有限计划数的集中触发和超时收尾。Cron/DST及其他策略的功能测试已有独立记录,本批未做这些场景的容量测量。长期积压样本已由[单独报告](phase-6-backlog.md)补充;下一步继续指标采集对照、长期存储增长、慢消费者/重连风暴、目标数据库拓扑与正式工具链/版本兼容门禁。