feat: add precise task business key and creation time queries
This commit is contained in:
75
docs/reports/phase-3-task-queries.md
Normal file
75
docs/reports/phase-3-task-queries.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# P3 业务键与创建时间查询回归
|
||||
|
||||
验证日期:2026-09-17。当前已实现服务端、SDK、迁移、接口及可运行场景;全量回归已正常退出,状态码0。P3的任务详情来源追踪和业务事务Outbox接入仍待交付,不能据此宣布Pulse或全平台完成。
|
||||
|
||||
## 1. 实现证据
|
||||
|
||||
- [服务输入](../../pulse/service/service.go):精确业务键、UTC创建时间下界/上界、有限页大小,非法值不进入存储。
|
||||
- [查询存储](../../internal/storage/mysql/task_query.go):固定四种索引分支、参数化SQL、创建时间/ID游标分页,v2摘要绑定全部筛选,旧游标只兼容原队列/状态查询。
|
||||
- [HTTP入口](../../internal/transport/httpserver/tasks.go)与[独立SDK](../../sdk/go/task_query.go):URL编码、UTC规范化、显式空参数与未知参数拒绝,SDK无数据库依赖。
|
||||
- [迁移000016](../../internal/storage/mysql/migrations/000016_task_query_filters.up.sql):business_key使用精确NO PAD二进制排序,增加两种队列业务键索引,中文字段含义同步。无新增模型字段、无外键/级联,仍为35个模型、289个持久化字段。
|
||||
- [接口手册](../api/task-queries.md)、[完整示例说明](../examples/task-query.md)及[源码](../../sdk/go/examples/task-query/main.go)。
|
||||
|
||||
## 2. 真实数据库验证
|
||||
|
||||
[TaskQuery集成](../../internal/storage/mysql/task_query_integration_test.go)使用真实受理任务,仅将测试创建时间调为精确边界来建立确定性数据:
|
||||
|
||||
1. 相同业务键不同任务、相同创建时间不同ID,按时间/ID倒序逐页遍历,无重复或遗漏。
|
||||
2. 精确区分尾部空格、大小写、预组合/组合Unicode及无关联键,创建下界包含、上界排除。
|
||||
3. 同命名空间其他队列、其他命名空间同键任务不进入本查询;191字符键仍生成有界游标并能完整翻页,纯空格键可原样受理与检索。
|
||||
4. 更改/删除业务键、更改状态/时间/队列/命名空间时,旧游标拒绝;等价UTC时刻及修改页大小仍可继续。
|
||||
5. 已取得游标后撤销队列范围,继续查询仍被当前权限拒绝。
|
||||
6. 原版无版本游标仅用于旧查询;重复字段、null、大小写别名、未知字段、未知版本和纳秒时间游标拒绝。
|
||||
7. 实际HTTP验证Unicode/保留字符编码、显式空键、重复参数、错误日期、非法UTF-8/编码、非法时间范围和未知名称。
|
||||
8. EXPLAIN FORMAT=JSON对四种筛选验证对应索引、range/ref访问、无filesort。验证的是查询计划,不是生产吞吐或容量。
|
||||
|
||||
旧v7升级测试同时保存包含重音字符和尾部空格的已有业务键,升级后原任务快照不变,原323个未替换索引组件保留,列排序规则正确,外键70→0。应用额度v9升级夹具同步还原新增索引与排序规则再实际重放迁移。
|
||||
|
||||
单项受理、计划生成、人工重试只在Go字符串为空时写NULL,避免不同连接排序规则下NULLIF比较把纯空格折叠为空。旧数据不推测补回丢失的值。
|
||||
|
||||
## 3. SDK与示例证据
|
||||
|
||||
[SDK单元测试](../../sdk/go/task_query_test.go)验证URL编码、时间规范化、精确revision、非法参数本地拒绝;[服务测试](../../pulse/service/task_query_test.go)验证时间/业务键边界与存储隔离。
|
||||
|
||||
[真实HTTP SDK集成](../../sdk/go/task_query_integration_test.go)提交同键/尾部空格不同键任务,分页查询、变更条件拒绝、精确时间边界和取消后原创建时间排序均通过。完整示例输出:
|
||||
|
||||
```text
|
||||
matched=2 pages=2 before_excluded=true cancelled=3
|
||||
```
|
||||
|
||||
示例使用普通提交/读取/取消凭据,不增加管理权限,不启动Worker,不调用外部业务系统,保留任务及审计。
|
||||
|
||||
## 4. 环境与复现
|
||||
|
||||
macOS、Go1.27.1、Docker单实例MySQL8.4.10,隔离数据库、随机测试凭据与回环端口,结束自动清理。
|
||||
|
||||
```sh
|
||||
make fmt test vet build
|
||||
make integration
|
||||
```
|
||||
|
||||
定向数据库回归已通过(16.148秒,含升级与包开销);新增的真实受理和最长业务键场景随后进入全量回归。普通未配置数据库的go test跳过Integration,不能替代真实数据库验证。
|
||||
|
||||
| 验证组 | 本轮实际结果 |
|
||||
| --- | --- |
|
||||
| fmt / race / vet / build | PASS |
|
||||
| 全量MySQL集成 / 任务查询用例 | PASS,101.225 / 0.38秒 |
|
||||
| SDK Worker完整组 | PASS,90.485秒 |
|
||||
| SDK计划 / 队列 / 批量 | PASS,5.704 / 4.461 / 1.368秒 |
|
||||
| 新查询SDK真实HTTP | PASS,1.324秒 |
|
||||
| SDK订阅管理 / 事件消费 | PASS,33.394 / 51.884秒 |
|
||||
| SDK人工核查与重试 | PASS,3.405秒 |
|
||||
| Inbox真实数据库与消费者故障 | PASS,34.643秒 |
|
||||
| SDK应用配额 | PASS,1.369秒 |
|
||||
| 九项节点/Worker进程故障 | PASS,60.625秒;连同Inbox消费者共十项进程故障 |
|
||||
| 全部运行示例 | 17个核心SDK示例 + 1个独立Inbox示例通过 |
|
||||
|
||||
完整脚本的终态退出码为0,未以中途日志推断完成。以上耗时是本次正确性回归记录,不是吞吐或容量指标。文档链接、JSON代码块及核心SDK无数据库/服务端依赖检查均通过。
|
||||
|
||||
## 5. 已知边界与后续
|
||||
|
||||
- 查询需要队列,时间界限可选。结果不含总数、大载荷或跨页快照,不提供前缀/模糊搜索、未设置业务键专用筛选或跨队列聚合。
|
||||
- 时间相同依赖ID稳定排序,状态可能跨页变化;可靠结果消费使用订阅,历史审计使用已有历史接口。
|
||||
- v2游标绑定筛选但不是权限证明;旧节点拒绝新参数,不允许删条件降级。新旧二进制混合查询和生产滚动升级尚未验收。
|
||||
- 新索引增加写入和存储成本;迁移需DDL维护窗口演练,生产规模容量、数据库切换及RPO/RTO仍在P6验证。
|
||||
- 任务详情尚未返回来源计划/触发记录,已对照原功能清单纳入P3补齐;业务事务Outbox也是剩余接入项;Weave执行与恢复仍按P4–P5推进,持续目标保持原范围。
|
||||
Reference in New Issue
Block a user