50 lines
5.0 KiB
Markdown
50 lines
5.0 KiB
Markdown
# P1 稳定性与历史归档定向回归
|
||
|
||
这份报告定义当前代码的可复现入口,命令成功才算目标环境完成验证。它不把本机测试结果当作生产容量承诺。
|
||
|
||
```sh
|
||
ORBIT_TEST_MYSQL_DSN='root:...@tcp(127.0.0.1:3306)/orbit_test' \
|
||
ORBIT_TEST_SERVER_BINARY="$PWD/bin/orbit" \
|
||
ORBIT_TEST_WORKER_URL='http://127.0.0.1:8080' \
|
||
ORBIT_TEST_WORKER_CREDENTIALS_FILE="$PWD/.local/worker.credentials.json" \
|
||
make stability-check
|
||
```
|
||
|
||
入口覆盖:
|
||
|
||
- `TestIntegrationEventProcessCrossNodeReconnectStorm`:在两个独立 Orbit 进程之间反复切换 WebSocket 上游,验证重连风暴期间一次处理、一次确认和一次持久交付尝试。
|
||
- `TestIntegrationEventProcessSlowConsumerPeerProgress`:节点 A 的容量 1 处理器阻塞时,节点 B 仍可推进自己的交付,确认慢消费者隔离。
|
||
- `TestIntegrationWithTxRetriesPreCommitDeadlock`:两个真实 MySQL 事务反向加锁,使用数据库锁竞争和事务重试指标确认提交前死锁被有界恢复。
|
||
- `TestIntegrationFairDispatchApplicationIsolation` 与 `TestIntegrationWorkflowVersionAndRaces`:真实锁等待和多节点竞争路径,不使用固定 sleep 推断锁结果。
|
||
- `TestIntegrationRetentionDiskGrowthAndPreview`:写入带终态时间的有界任务样本,读取 `information_schema.TABLES` 的数据/索引字节增长,并核对保留策略预览只返回安全候选。
|
||
|
||
保留策略由数据库按命名空间保存,默认关闭归档。控制台单管理员通过“保留策略”页面修改窗口,要求版本、幂等键和原因;审计记录保留前后快照。导出是固定表目录的只读 JSON 快照,带 SHA-256 和策略版本,源数据仍保留。未确认交付、未知效果、未结束任务/流程、未处理 Inbox 和有效幂等记录不会成为普通归档候选。最终删除执行器、归档介质和目标拓扑 RPO/RTO 需要单独验收。
|
||
|
||
## 本地实测记录(2026-09-23)
|
||
|
||
环境为 macOS / arm64、Go 1.27.1、Docker MySQL 8.4.10。以下是隔离测试结果,不是百万企业容量或跨故障域高可用承诺。
|
||
|
||
上一批实现 `2f95d9c` 完成 `make test`、`make vet`、`make build`、`make docs-check` 与完整 `make integration`,包括独立 SDK 示例、真实进程故障及升级检查:
|
||
|
||
| 场景 | 观察结果 |
|
||
| --- | --- |
|
||
| 跨节点重连 | 两个独立进程间发生 4 次重连,业务处理 1 次,持久交付尝试 1 次 |
|
||
| 慢消费者 | 节点 A 消费阻塞期间,节点 B 仍完成独立交付 |
|
||
| 提交前死锁 | 真实反向加锁产生死锁,观察到 1 次有界重试后恢复 |
|
||
| 锁等待隔离 | 12 个阻塞连接参与应用公平派发验证,其他应用继续推进 |
|
||
| 新装与历史升级 | Schema 30;外键数量 0;v7 升级保留原 323 个索引组成项 |
|
||
| 有界磁盘增长 | 256 × 32 KiB 样本,表和索引统计从 1,818,624 增至 17,661,952 字节;候选预览 100 条、`more=true` |
|
||
|
||
本次继续补齐控制台归档分页和失败边界,在一次性数据库上运行 `go test -race -count=1 -run TestIntegrationRetention -v ./internal/storage/mysql`:
|
||
|
||
- `TestIntegrationRetentionPolicyIsSharedAuditedAndIdempotent`:不同 store 读取相同策略;相同幂等操作重放不增加修订号或重复写审计;旧版本修改被拒绝。
|
||
- `TestIntegrationRetentionDiskGrowthAndPreview`:256 条样本中 254 条终态,另 2 条保留为未知效果/运行中租约;终态记录采用相同完成时间验证复合游标。第一批 1 条,后续每批最多 37 条,共 8 批得到 254 条唯一根记录,源表仍为 256 条。
|
||
- 每批校验 SHA-256、策略版本及相同截止时间;跨类别/命名空间游标、无效游标、越界批量、业务 Bearer、旧策略和关闭策略均被拒绝。
|
||
- 此次物理统计增量为 12,238,848 字节(28,459,008 → 40,697,856)。该一次性数据库包含前面修正测试夹具时留下的样本,不能与上一轮绝对值直接比较;这里只验证有界写入增长及预览/导出的行为,不推导长期容量。
|
||
|
||
`make console-e2e` 在另一个空库从迁移与管理员初始化开始,验证:6 个已成功任务可见、WS Worker 排空、失败任务第 2 次成功、定时任务来源固定;保留策略保存/原键重放、旧版本 409、7 类预览、空快照摘要、退出后任务及策略接口 401 均通过。
|
||
|
||
本次 `make test`、`make vet`、`make build`、`make docs-check` 通过。服务端归档实现和迁移本次未修改,新增用例使用真实 MySQL 补充已有完整集成结果。
|
||
|
||
浏览器使用同一批隔离样本验证真实页面:关闭导出时仍可预览;存在未保存修改时禁用预览和导出;开启并保存后版本从 3 升至 4;首批 20 条、第二批累计 40 条且均通过浏览器 SHA-256 校验;切换类别重置进度并清除旧下载链接;空流程快照显示 0 条/已到末批且禁用继续导出。页面错误日志为空。开关点击区域和焦点提示已修正,截止时间带年份和 UTC,源数据不会被页面操作删除。
|