refactor(saas): 架构重构 + 性能优化 — 借鉴 loco-rs 模式

Phase 0: 知识库
- docs/knowledge-base/loco-rs-patterns.md — loco-rs 10 个可借鉴模式研究

Phase 1: 数据层重构
- crates/zclaw-saas/src/models/ — 15 个 FromRow 类型化模型
- Login 3 次查询合并为 1 次 AccountLoginRow 查询
- 所有 service 文件从元组解构迁移到 FromRow 结构体

Phase 2: Worker + Scheduler 系统
- crates/zclaw-saas/src/workers/ — Worker trait + 5 个具体实现
- crates/zclaw-saas/src/scheduler.rs — TOML 声明式调度器
- crates/zclaw-saas/src/tasks/ — CLI 任务系统

Phase 3: 性能修复
- Relay N+1 查询 → 精准 SQL (relay/handlers.rs)
- Config RwLock → AtomicU32 无锁 rate limit (state.rs, middleware.rs)
- SSE std::sync::Mutex → tokio::sync::Mutex (relay/service.rs)
- /auth/refresh 阻塞清理 → Scheduler 定期执行

Phase 4: 多环境配置
- config/saas-{development,production,test}.toml
- ZCLAW_ENV 环境选择 + ZCLAW_SAAS_CONFIG 精确覆盖
- scheduler 配置集成到 TOML
This commit is contained in:
iven
2026-03-29 19:21:48 +08:00
parent 5fdf96c3f5
commit 8b9d506893
64 changed files with 3348 additions and 520 deletions

View File

@@ -0,0 +1,67 @@
# zclaw-saas 架构重构完成记录
> 记录时间: 2026-03-29
> 本文档记录借鉴 loco-rs 模式对 zclaw-saas 后端进行的架构重构和性能优化。
## 重构概要
### Phase 0: 知识库
- `docs/knowledge-base/loco-rs-patterns.md` — loco-rs 10 个可借鉴模式研究
### Phase 1: 数据层重构
- `crates/zclaw-saas/src/models/` — 15 个 `#[derive(sqlx::FromRow)]` 类型化模型文件
- 替代了所有 `(String, String, ...)` 元组解构
- 编译期字段检查,消除运行时字段错位风险
- 3 次登录查询合并为 1 次 `AccountLoginRow` 查询
- Relay handler N+1 查询修复(精准 SQL 替代全量加载)
### Phase 2: Worker + Scheduler 系统
- `crates/zclaw-saas/src/workers/` — Worker trait + 5 个具体实现
- `LogOperationWorker` — 异步操作日志
- `CleanupRefreshTokensWorker` — 过期 token 清理
- `CleanupRateLimitWorker` — 限流条目清理
- `RecordUsageWorker` — 异步使用量记录
- `UpdateLastUsedWorker` — API token last_used_at 更新
- `crates/zclaw-saas/src/scheduler.rs` — TOML 声明式调度器
- 支持 `5m`/`1h`/`24h` 时间间隔格式
- 从配置文件加载,无需改代码调整调度
- `crates/zclaw-saas/src/tasks/` — CLI 任务系统
### Phase 3: 性能修复
| 问题 | 修复 | 文件 |
|------|------|------|
| Relay N+1 查询 | 精准 SQL 替代 `list_models()` 全量加载 | `relay/handlers.rs` |
| Config RwLock 竞争 | `Arc<AtomicU32>` 无锁 rate limit 读取 | `state.rs`, `middleware.rs` |
| SSE `std::sync::Mutex` | `tokio::sync::Mutex` 异步安全 | `relay/service.rs` |
| Login 3 次查询 | 合并为 1 次 `AccountLoginRow` 查询 | `auth/handlers.rs` |
| `/auth/refresh` 阻塞清理 | 迁移到 Scheduler 定期执行 | `auth/handlers.rs` |
### Phase 4: 多环境配置
- `config/saas-development.toml` — 开发环境
- `config/saas-production.toml` — 生产环境
- `config/saas-test.toml` — 测试环境
- `ZCLAW_ENV` 环境变量选择配置
- `ZCLAW_SAAS_CONFIG` 精确路径覆盖(最高优先级)
## 配置加载优先级
```
ZCLAW_SAAS_CONFIG (精确路径)
> ZCLAW_ENV (环境选择 config/saas-{env}.toml)
> saas-config.toml (默认)
```
## Scheduler 配置示例
```toml
[scheduler]
jobs = [
{ name = "cleanup_refresh_tokens", interval = "1h", task = "cleanup_refresh_tokens", run_on_start = false },
{ name = "cleanup_devices", interval = "24h", task = "cleanup_devices", run_on_start = true },
]
```
## 已知限制 / 待改进
- `log_operation()` 仍为同步调用(操作日志不是性能瓶颈,后续可按需迁移)
- TEXT 时间戳未迁移到 TIMESTAMPTZ需要 SQL 迁移系统,影响范围大)
- 内联 SQL schema 未迁移到 `sqlx-cli` migrations