77 lines
5.6 KiB
Markdown
77 lines
5.6 KiB
Markdown
# P3 任务直接来源回归
|
||
|
||
验证日期:2026-09-17。服务端、SDK和三类现有场景已接入直接来源查询;定向MySQL、基础检查及全量隔离回归均已通过,完整脚本正常退出,状态码0。业务事务Outbox仍是P3待交付项,Weave按P4–P5继续。
|
||
|
||
## 1. 实现范围
|
||
|
||
- [服务模型](../../pulse/service/source.go)与[存储查询](../../internal/storage/mysql/task_source.go):DIRECT、MANUAL_RETRY、SCHEDULE三类来源;计划ID、触发记录、冻结版本及合并范围;人工重试仅一跳父任务。
|
||
- [HTTP路由](../../internal/transport/httpserver/history.go)提供GET /v1/tasks/{task_id}/source,沿用tasks:read和队列范围,拒绝查询参数。
|
||
- [独立SDK](../../sdk/go/task_source.go)验证响应ID、类型组合、版本和时间,保留uint64精度;没有数据库依赖或自动重试。
|
||
- [接口手册](../api/task-source.md)、[普通提交](../../examples/tasks/main.go)、[计划](../../examples/schedules/main.go)及[人工恢复](../../examples/recovery/main.go)同步提供调用与输出。
|
||
|
||
来源独立读取,不改变Task/TaskSummary及Worker协议,不在派发路径增加关联查询。复用现有(namespace_id,task_id)触发唯一索引及计划版本键,不新增迁移、索引或持久化字段;平台仍为35个实体、289个中文注释字段。新只读结构的字段也均有中文说明。
|
||
|
||
## 2. 真实MySQL与HTTP
|
||
|
||
[TaskSource集成](../../internal/storage/mysql/task_source_integration_test.go)已验证:
|
||
|
||
1. 普通受理和人工派生返回正确类型及直接父任务,读取前后任务快照不变。
|
||
2. 跨命名空间、未授权队列返回NOT_FOUND,撤销凭据后拒绝继续查询;缺失或跨命名空间父任务返回UNAVAILABLE。
|
||
3. 计划发布v2后,已生成任务仍指向v1和原触发记录,任务内容不变。
|
||
4. 只有tasks:read的凭据能查询有限来源引用,但读取完整计划仍被PERMISSION_DENIED拒绝。
|
||
5. 实际HTTP拒绝非法ID、参数与编码,隐藏无权限任务;响应不包含模板、payload或租约秘密。
|
||
6. COALESCED来源保留原触发时间和排除上界。
|
||
7. 模拟无外键数据库中的悬空所有者、缺失版本、错误计划队列、反向关联残留、未知所有者及门控,均拒绝且返回零值而非部分来源;恢复正确关联后查询成功。
|
||
|
||
定向回归总计24.058秒(含包及升级开销),TaskSource四组9.46秒通过。v7旧库升级验证外键70→0、323个未替换索引组件保留、已有任务内容不变;应用资源升级夹具还原历史真实utf8mb4_0900_as_cs后重放后续迁移。该调整仅修正测试夹具,生产迁移000016的精确utf8mb4_0900_bin保持不变。
|
||
|
||
## 3. SDK与完整场景
|
||
|
||
[SDK单元](../../sdk/go/task_source_test.go)覆盖三类有效响应、FIRED/COALESCED、9007199254740993版本精度、错误task_id、未知种类、字段矛盾、非法版本/时间/ID以及本地拒绝不安全路径。
|
||
|
||
[计划真实HTTP集成](../../sdk/go/schedule_integration_test.go)在发布新版本后核对旧任务固定来源;[恢复真实HTTP集成](../../sdk/go/recovery_integration_test.go)在回执丢失后以原身份恢复,再查询直接来源与人工重试关联。
|
||
|
||
已有三个可运行程序新增输出,原输出继续保留:
|
||
|
||
```text
|
||
source_kind=DIRECT
|
||
source_kind=SCHEDULE fixed_version=1
|
||
source_kind=MANUAL_RETRY parent=<原任务ID>
|
||
```
|
||
|
||
这些行来自不同程序,不是同一条任务同时具有三种来源。完整启动命令分别见[SDK入门](../sdk/README.md)、[计划场景](../api/schedules.md#6-sdk-与完整示例)及[恢复场景](../examples/recovery.md)。
|
||
|
||
## 4. 复现与结果
|
||
|
||
macOS、Go1.27.1、Docker单实例MySQL8.4.10,随机测试凭据、回环端口和一次性数据库。脚本完成后清理隔离资源。
|
||
|
||
```sh
|
||
make fmt test vet build
|
||
make integration
|
||
```
|
||
|
||
普通未配置数据库的go test会跳过Integration,不能替代真实数据库回归。本轮全量脚本完成后的实际结果:
|
||
|
||
| 验证组 | 本轮结果 |
|
||
| --- | --- |
|
||
| fmt / race / vet / build | PASS |
|
||
| 全量MySQL / TaskSource四组 | PASS,108.438 / 9.98秒 |
|
||
| SDK Worker完整组 | PASS,87.120秒 |
|
||
| SDK计划 / 队列 / 批量 / 查询 | PASS,5.815 / 4.419 / 1.391 / 1.461秒 |
|
||
| SDK订阅管理 / 事件消费 | PASS,33.366 / 52.813秒 |
|
||
| SDK人工恢复与来源 | PASS,3.398秒 |
|
||
| Inbox数据库与消费者故障 | PASS,34.591秒 |
|
||
| SDK应用额度 | PASS,1.370秒 |
|
||
| 九项节点/Worker进程故障 | PASS,60.842秒;加上Inbox消费者,共十项进程故障 |
|
||
| 可运行程序 | 17个核心SDK示例 + 1个独立Inbox示例通过,三个新增来源输出符合预期 |
|
||
|
||
零外键和历史迁移校验继续通过;文档链接、JSON块及核心SDK无服务端/数据库依赖检查通过。上述耗时为这次正确性回归记录,不是吞吐或容量结论。没有使用中途PASS日志推断脚本完成。
|
||
|
||
## 5. 交付边界
|
||
|
||
- 此接口只读直接来源,没有链式递归、来源全文或逆向全量任务搜索;状态和执行历史使用对应查询接口。
|
||
- tasks:read只授予当前任务的有限来源引用,完整计划/版本仍独立鉴权。来源查询不产生执行权或恢复权限。
|
||
- 关联损坏返回503,需要排查;不自动猜测或修复归属。所有者与来源由写入事务固定,读取不依赖数据库外键。
|
||
- Weave流程来源随流程引擎实现,当前未知所有者明确拒绝;旧节点缺少新路由时404不能作为DIRECT使用。
|
||
- 本轮不新增执行/持久化协议,也不提供生产吞吐、数据清理或数据库故障切换保证;这些仍按P6验证。
|