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
2.7 KiB
2.7 KiB
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 配置示例
[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-climigrations