Details (original message): Document the dual-tier storage, multitenancy, and scaling delivery (proposal, implementation record, test report, usage guide)
4.4 KiB
4.4 KiB
测试报告:双档存储、多租户与规模化(2026-09-30)
对象:提案 D17–D24 全量实施。 环境:linux/amd64,go1.27.1,node v26.10.0;本机原生 PostgreSQL 18.6(临时测试簇 initdb,端口 55434,扩展 vector/pg_trgm 可用)与原生 Redis 8.10.2(临时实例,端口 55379);全程无容器。 组合基线:Dev 仓工作区(core/backend/frontend/documents 见下述提交)。
1. 自动化测试
| 验证 | 命令 | 结果 |
|---|---|---|
| 组合全量 | make test(core + backend + frontend) |
PASS:core ok;backend 11 包全 ok;前端 vitest 9/9(含新增 auth 门 4 例) |
| 竞态全量 | go test -race ./...(backend) |
PASS(11 包;重复 2 次) |
| 嵌入式档存储 | go test ./internal/store/ |
PASS:迁移升降级(老库→v5 数据保留/事件重编号)、租户隔离负例、并发消息 seq 唯一(24 并发)、并发设置合并不丢键(8 写者)、批量事件 seq、HITL 双重 resolve 仅一次、VACUUM INTO 备份可开、工件原子性、画像租户边界 |
| PG 档存储/检索 | AGENT_PG_TEST_DSN=<原生PG> go test -race ./internal/store/ ./internal/rag/ ./internal/pgbus/ |
PASS(-race 重复 3 次):同套用例在真实 PG 约束下通过;PG 专属:tsvector+trigram 中文子串检索、咨询锁并发、BYTEA 向量 |
| 限流 | AGENT_REDIS_TEST_ADDR=<原生Redis> go test ./internal/ratelimit/;go test ./internal/server/(429 e2e) |
PASS:进程内窗口滚动、Redis 共享窗口、429 中间件与放行 |
| 向量 RAG | go test -race ./internal/rag/ |
PASS:分块(聚包/硬切重叠/空输入)、索引分块+向量入库、embedding 失败降级纯全文、RRF 向量路主导排序、租户/维度过滤 |
| 单二进制 | make build(CGO_ENABLED=0) |
PASS:bin/agent-system 18MB 静态 ELF(file 确认 statically linked),默认档零外部服务不变 |
说明:曾出现一次并行全量 PG 档运行中 store 单包快败(0.24s,疑似瞬时连接争用);随后 3×PG -race、2×全量 -race、1×全量共 5 次复跑均 PASS。未复现,留档观察。
2. 真实链路冒烟(真实二进制 + 原生服务)
2.1 PG 多用户档(--dsn,认证 auto=on)
| 步骤 | 证据 |
|---|---|
| 密钥创建 | agent-system apikey create --dsn … --owner alice → ask_b237…(明文仅一次) |
| 启动 | serve 日志:storage tier: postgres、auth: API key required、pgbus: LISTEN agent_events |
| 未带 key | GET /api/projects → 401 |
| alice 带 key | POST /api/projects → 200,响应含 "owner":"alice" |
| 知识入库+中文检索 | manual 入库 → GET /api/knowledge/search?q=中文子串 命中(PG tsvector+trigram 路径) |
| 跨租户负例 | bob 密钥读 alice 项目 → 404 |
| PG 档备份 | POST /api/admin/backup → 501 + pg_dump 指引(按设计) |
2.2 嵌入式默认档(单二进制,无认证)
| 步骤 | 证据 |
|---|---|
| 启动/健康 | GET /api/health → {"ok":true…} |
| mock 对话 | 消息 → run completed;会话终态对账 lastSeq 103 / msgs 2 / runs 1(事件批量落盘,会话内连续 seq) |
| 在线备份 | POST /api/admin/backup → 200,产出 agent-system-20260930T015032Z.db(VACUUM INTO) |
3. 覆盖对照(提案决策 → 证据)
- D17/D18 认证与租户:§1 认证 e2e + §2.1 401/404 负例;store 层租户隔离负例(§1)。
- D19/D20 双档与迁移:§1 双档同套用例;迁移升降级含老库升级路径(数据保留)。
- D21 一致性:并发 seq 唯一、并发设置合并、HITL 原子、工件原子(§1,真实库约束)。
- D22 事件批处理:§2.2 lastSeq 103 + 会话内连续 seq;race 全量。
- D23 向量 RAG:§1 rag 包 + PG 档向量用例;未配置退化为全文(默认行为不变)。
- D24 多实例地基:pgbus 集成(NOTIFY→LISTEN→bus 转发 3s 内到达);限流双后端。
4. 遗留与风险
- pgvector HNSW 列级索引未启用(BLOB 余弦扫描,≤数万块/实例;超限再优化,契约不动)。
- SSE
?key=兜底(EventSource 限制):网关日志侧需注意脱敏。 - 多实例上线前置:会话亲和路由与共享卷 artifactsDir 指配(部署设计待立项)。
- 事件 seq 迁移一次性语义变化(老客户端重放窗口可能少量重复投递,UI 幂等)。