Files
zclaw_openfang/docs/knowledge-base/architecture-refactoring.md
iven 8b9d506893 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
2026-03-29 19:21:48 +08:00

68 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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