Files
orbit/docs/reports/phase-1.md

4.3 KiB
Raw Blame History

P1 任务受理与 SDK 回归记录

日期:2026-09-17。结论:任务受理阶段已实现并通过本地真实 MySQL 回归;执行引擎和生产高可用验收仍未完成。

实现范围

  • 凭据摘要校验、有效期/撤销、应用与命名空间启停、动作和队列范围。
  • 受控 bootstrap 命令:创建应用、命名空间、初始队列与凭据,0600 新文件交付,初始化审计。
  • 队列创建/查询,任务提交/单条查询/游标分页/WAITING 普通任务取消。
  • 同一事务中的幂等预留、语义摘要、资源状态、持久化事件、管理审计和回执。
  • 独立 Go SDK 的对应方法、类型化错误、请求身份和精确 JSON 数据。
  • Markdown 接口字段、失败行为、SDK 接入、任务受理场景源码。

新增迁移 000002_task_api:业务 JSON 改为 MEDIUMTEXT + JSON_VALID,避免 MySQL 原生 JSON 对业务数字的重新编码;元数据仍使用原生 JSON。增加队列内任务创建时间及状态分页索引。初始迁移校验和保持不变。

环境与执行入口

本机 macOS / arm64,Go 1.27.1;Docker 隔离容器 MySQL 8.4.10,回环随机端口、随机密码、用后清理。没有连接已有业务数据库。

make test
make vet
make build
make integration
go test ./internal/jsonvalue -fuzz FuzzCanonical -fuzztime=5s
cd sdk/go
GOWORK=off go test -race ./...
GOWORK=off go vet ./...

Go 未全局安装时,通过 make GO=/absolute/path/to/go 指定。集成脚本支持 GO、DOCKER、ORBIT_TEST_MYSQL_IMAGE。

实际验证

场景 结果
初始迁移 + 前向迁移,模型字段、隔离、预算、不可变历史、dirty/checksum 防护 通过
16 个并发请求共用一个提交键 1 次创建、其余复用;同一任务,受理事件和提交审计各 1 条
首次响应未被调用方确认后的原样重报 返回原任务与原回执;deduplicated=true
字段顺序、1 与 1.00 等价;同键不同内容 等价请求复用;不同内容 409
9007199254740993、大整数和多位小数 提交、GET、缓存回执不损失数字精度
错误秘密、过期、撤销、应用/命名空间禁用 拒绝
跨命名空间、只读动作、队列范围 拒绝对应越权访问
未知/重复/别名字段、非法 Unicode、超大 body、过期时间、分页上限 拒绝且不留下成功幂等预留
游标分页 无重复项;不带业务 payload;更换过滤条件后游标无效
两个不同取消键竞争同一版本 1 个成功、1 个 409;取消审计 1 条,终结事件 1 条
同一取消键重复确认 原版本仍能取回原取消回执,不重复追加历史
注入审计 INSERT 失败 503;任务仍 WAITING/revision=1;事件和预留整体回滚;HTTP 不泄露 SQL 错误
初始化交付失败 应用、队列、凭据全部回滚
已取消 context 提交 不提交
SDK 重定向、错误解析、精确 revision/JSON、写操作不静默重试 通过
真实 CLI → 服务进程 → 独立 SDK 示例 alive/ready;duplicate=true;最终 CANCELLED/revision=2
JSON 规范化模糊测试 一次约 20 万输入执行,未发现规范化不稳定;不等同于完整形式化证明

集成测试会主动制造一条 UNAVAILABLE 日志以验证审计失败回滚,该日志是预期结果。实际回归曾发现可空 SQL 结果直接扫描到 json.RawMessage 的兼容问题,已改为先扫描 []byte,再赋给响应 DTO,并由受理与查询测试覆盖。

尚未验证或未实现

  • P1 没有 Worker、WebSocket、自动执行、延时扫描、重试扫描或定时计划;任务不会自行完成。
  • 取消仅覆盖 WAITING 且非流程所属任务;运行中取消、未知结果核查按 P2/P5 完成。
  • 队列并发/速率配置已保存,尚未启动执行限流;整体 API 配额与背压在后续阶段。
  • 凭据轮换/管理 API、数据清理、完整监控、备份恢复在后续阶段。
  • “响应未确认重报”当前验证为重复发送已经提交的请求;未注入真实网络断路或数据库提交 ACK 丢失。
  • 未运行生产拓扑、复制切换、跨故障域恢复或容量压测。测试耗时不作为吞吐/延迟指标。
  • SDK 尚未发布版本,代码保存在本地开发分支,当前报告不代表远端发布或生产上线。