1
0
Files
DiAL/openspec/changes/backend-architecture-hardening/proposal.md
lanyuanxiaoyao 147a2559ae refactor: 后端架构加固 — 泛型化、批量查询、bootstrap 统一、路径修复与 pageSize 上限
- CheckerDefinition 泛型化,HTTP/Command checker 移除 resolved target 断言
- 新增 ProbeStore.getAllRecentSamples 消除 targets 路由 N+1 查询
- 统一 getAllTargetStats 与 getTargetStats 的 availability 精度
- Engine rejected 结果写入 internal error 记录,提升可观测性
- 新增 bootstrap.ts 统一 dev/production 启动序列
- dataDir 相对路径改为基于配置文件目录解析
- validatePagination 增加 pageSize 上限 200 校验
- 修复 ErrorBoundary override 标记
- 更新 README/DEVELOPMENT 文档,新增完整测试覆盖
2026-05-13 18:15:46 +08:00

2.5 KiB
Raw Blame History

Why

后端在 target 规模增长(预计到 100和 checker 类型扩展(预计超过 5 种)的趋势下,存在查询性能瓶颈、可观测性盲区、启动逻辑重复、路径解析 bug 和类型安全不足等问题。本次变更集中修复这些架构短板,为后续扩展打好基础。

What Changes

  • targets 路由 N+1 查询优化handleTargets 中对每个 target 单独调用 getRecentSamples 改为批量查询,消除 N 次独立 SQL
  • Engine rejected 结果持久化probeGroupPromise.allSettled 的 rejected 结果写入 matched: false 的 check_resultfailure 标记为 internal error替代仅 console.warn
  • 启动逻辑统一:抽取 bootstrap.tsdev.ts 和 build 生成的 entry 共用同一启动序列,消除重复
  • dataDir 相对路径修复config-loader.ts 中用 resolve(configDir, dataDir) 处理相对路径,确保从任意 cwd 启动时数据库位置一致
  • validatePagination 加 pageSize 上限:限制最大 pageSize 为 200超出返回 400
  • CheckerDefinition 泛型化:为 CheckerDefinition 加泛型参数 <TResolved extends ResolvedTargetBase>checker 内部获得完整类型安全registry 用类型擦除保持解耦
  • availability 精度统一getAllTargetStatsgetTargetStats 的 availability 计算精度不一致,统一为相同的四舍五入策略

Capabilities

New Capabilities

  • server-bootstrap: 统一的服务启动引导流程dev 和 production 共用

Modified Capabilities

  • batch-data-queries: 新增 getAllRecentSamples 批量采样查询,消除 targets 路由的 N+1 问题;修复 availability 精度不一致
  • probe-engine: Engine 对 rejected 结果写入 matched:false 记录而非静默丢弃
  • probe-config: dataDir 相对路径基于 configDir 解析
  • probe-api: validatePagination 增加 pageSize 上限校验
  • checker-runner-abstraction: CheckerDefinition 接口泛型化checker 内部类型安全

Impact

  • 代码src/server/ 下约 8 个文件变更,新增 bootstrap.tsstore.ts 的批量查询方法;另修复 src/web/components/ErrorBoundary.tsxoverride 标记typecheck 前置修复)
  • APIpageSize 超过 200 时返回 400新增约束当前前端未使用超大 pageSize
  • 构建scripts/build.ts 生成的 entry 改为调用 bootstrap
  • 测试:需新增/更新 engine、store、middleware、bootstrap 相关测试