Files
orbit/docs/reports/phase-6-backlog.md

58 lines
4.6 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。本批验证计划触发在低执行容量下形成**持久化**待执行积压,并连续读取 MySQL 中的任务状态计数。它是单节点、一次性数据库的正确性和趋势样本,不是生产容量、SLA、高可用或百万企业承载结论。
## 场景和结果
在一个隔离命名空间创建 32 个共享起止时间的固定间隔计划,每个计划 8 个触发点,共 256 个任务。使用 1 个 WSS Worker、容量 1;队列只读快照为并发4、每秒授权10。触发全部落库后,Worker 逐步完成任务,工具整体截止 180 秒,故意让积压样本保留未完成分母。
| 指标 | 结果 |
| --- | ---: |
| 预期/观察触发点 | 256 / 256 |
| 预期/生成任务 | 256 / 256 |
| 完成核验成功 | 173 |
| 未核验任务 | 83 |
| 有效本地处理器调用 | 173 |
| 重复调用 | 0 |
| 最大观察等待积压 | 249 |
| 截止时等待积压 | 83 |
| 退出码 | 1(预期的 `RUN_TIMEOUT`) |
| 计划收尾 | 32 个 `pause_confirmed=true` |
| 数据库最终任务/成功任务 | 256 / 173 |
| 触发记录重复任务 | 0 |
| 实际外键 | 0 |
原始工具报告:[sample-256-deadline.json](data/phase-6-backlog/sample-256-deadline.json)。工具把 `expected`、`occurrences`、`fired`、`verified_success`、`unverified` 分开;83 个未核验任务没有被解释成失败、撤销或成功。暂停只阻止新的计划触发,不取消已生成任务,因而最终数据库仍保留待处理任务供后续沿原身份核对。
## 持久化曲线
工具运行期间每 2 秒通过独立数据库连接读取 `pulse_tasks` 状态、触发记录和未暂停计划数量。触发集中完成后,`occurrences` 保持 256;`waiting` 从最高 249 随 Worker 逐步完成下降到截止时 83,`succeeded` 从0增至173。曲线原始点见[curve.json](data/phase-6-backlog/curve.json),最终数据库快照见[database.json](data/phase-6-backlog/database.json)。采样时间仅用于排列趋势,未混入任务阶段延迟统计。
| 采样阶段 | waiting | succeeded | occurrences | unpaused_schedules |
| --- | ---: | ---: | ---: | ---: |
| 触发前 | 0 | 0 | 0 | 0 |
| 触发完成后早期 | 242 | 14 | 256 | 32 |
| 中段 | 180 | 76 | 256 | 32 |
| 后段 | 98 | 158 | 256 | 32 |
| 截止前最后点 | 83 | 173 | 256 | 32 |
本批原始样本没有开启指标监听,也没有独占 CPU、内存、磁盘或数据库资源;因此已保存曲线只证明持久状态和收尾行为,不证明资源消耗曲线。随后脚本已加入临时指标端口和 `metrics.jsonl` 采样,会在下一次复现中留存服务进程 CPU/RSS、MySQL 容器资源、数据库连接池等待、提交前事务重试/耗尽计数和业务快照计数;新文件仍只是单节点原始采样。目标拓扑容量测试还需要采集锁等待、复制延迟和队列阶段延迟,并进行多轮稳态与恢复对照。
## 环境与复现
实际工具链 Go 1.25.14 Linux arm64,通过临时 modfile 构建,仓库声明的 Go 1.27.1 未改;一次性 MySQL 8.4.10,Docker VM 12 CPU/12,529,274,880 字节内存,其他容器可能共享资源。服务端、MySQL 和工具共享容器网络命名空间,不发布宿主机端口。源码/二进制/报告哈希和完整参数见[environment.json](data/phase-6-backlog/environment.json)。该二进制来自已提交的 `2973459`,构建后没有修改源码。
在 SDK 目录使用隔离凭据可复现核心命令:
```sh
ORBIT_URL=http://127.0.0.1:$PORT \
ORBIT_CREDENTIALS_FILE=/tmp/schedule-backlog.credentials.json \
./orbit-schedule-load \
-schedules 32 -requests 8 -workers 1 -capacity 1 \
-start-delay 5s -run-timeout 180s -poll-interval 100ms
```
准备阶段必须使用一次性 MySQL、`orbit-migrate up`、隔离队列和 `worker-access`/`schedule-access` 权限;不要把这条命令指向生产队列。命令预期在本样本的速率和容量下以非零退出,并在报告中保留未核验分母。收尾后使用 `orbit-admin verify`,再从独立数据库连接检查任务状态和外键数量。完整启动/清理方式按[定时工具手册](../api/schedule-load.md)执行;仓库提供[`scripts/test-schedule-backlog.sh`](../../scripts/test-schedule-backlog.sh),设置 `ORBIT_TEST_KEEP_ARTIFACTS=1` 可保留报告、曲线和数据库快照。脚本只使用一次性 MySQL,退出0表示预期的工具非零截止结果已核对。
本批没有验证长期运行数小时的存储增长、历史归档、跨节点公平、Worker 重连风暴、MySQL 故障切换、备份恢复或 RPO/RTO;这些仍属于 P6/P7 未完成门槛。