Files
Agent-System-Documents/docs/reports/2026-09-30-dual-tier-test-report.md
weichen 13fd7b3a55 Document the dual-tier storage
Details (original message):
Document the dual-tier storage, multitenancy, and scaling delivery (proposal, implementation record, test report, usage guide)
2026-09-30 02:39:50 +00:00

4.4 KiB
Raw Permalink Blame History

测试报告:双档存储、多租户与规模化(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 幂等)。