1
0

feat(cache): 实现 RoutingCache 和 StatsBuffer 优化数据库写入

- 新增 RoutingCache 组件,使用 sync.Map 缓存 Provider 和 Model
- 新增 StatsBuffer 组件,使用 sync.Map + atomic.Int64 缓冲统计数据
- 扩展 StatsRepository.BatchUpdate 支持批量增量更新
- 改造 RoutingService/StatsService/ProviderService/ModelService 集成缓存
- 更新 usage-statistics spec,新增 routing-cache 和 stats-buffer spec
- 新增单元测试覆盖缓存命中/失效/并发场景
This commit is contained in:
2026-04-22 19:24:36 +08:00
parent f5e45d032e
commit df253559a5
20 changed files with 1377 additions and 91 deletions

View File

@@ -13,14 +13,15 @@
#### Scenario: 记录成功请求
- **WHEN** 请求成功转发到供应商
- **THEN** 网关 SHALL 增加该供应商和模型的请求计数
- **THEN** 网关 SHALL 记录当前日期的统计
- **THEN** 网关 SHALL 通过 StatsBuffer 增加该供应商和模型的请求计数
- **THEN** 网关 SHALL 异步批量写入数据库(定时或阈值触发)
- **THEN** 网关 SHALL 不阻塞响应
#### Scenario: 记录流式请求
- **WHEN** 流式请求成功完成
- **THEN** 网关 SHALL 增加该供应商和模型的请求计数
- **THEN** 网关 SHALL 在流结束后记录统计
- **THEN** 网关 SHALL 通过 StatsBuffer 增加该供应商和模型的请求计数
- **THEN** 网关 SHALL 在流结束后异步记录统计
### Requirement: 使用统计记录统一模型标识
@@ -90,10 +91,9 @@
#### Scenario: 并发请求
- **WHEN** 同时处理多个并发请求
- **THEN** 网关 SHALL 正确为每个请求增加请求计数
- **THEN** 网关 SHALL 使用原子操作正确增加每个请求的计数
- **THEN** 不 SHALL 因并发写入而丢失统计
**变更说明:** 并发控制在 StatsRepository 中通过数据库事务实现。API 接口保持不变。
- **THEN** SHALL 使用 StatsBuffer 的内存计数器
### Requirement: 使用 service 层处理业务逻辑
@@ -121,6 +121,13 @@ Service SHALL 通过 StatsRepository 访问数据。
- **THEN** SHALL 调用对应的 StatsRepository 方法
- **THEN** SHALL 使用 domain.UsageStats 类型
#### Scenario: 批量更新统计
- **WHEN** StatsBuffer 刷新统计
- **THEN** SHALL 调用 StatsRepository.BatchUpdate
- **THEN** SHALL 使用事务更新或创建统计记录
- **THEN** SHALL 支持增量更新request_count + delta
#### Scenario: 事务处理
- **WHEN** 记录统计
@@ -136,3 +143,36 @@ Service SHALL 通过 StatsRepository 访问数据。
- **WHEN** 查询统计
- **THEN** SHALL 使用 (provider_id, model_name, date) 复合索引
- **THEN** SHALL 优化查询性能
### Requirement: 统计数据可接受少量丢失
统计记录方式改为内存缓冲,可接受少量丢失。
#### Scenario: 进程崩溃丢失统计
- **WHEN** 进程崩溃
- **THEN** MAY 丢失最近 flushInterval 内的统计
- **THEN** 统计数据用于监控,可接受少量丢失
#### Scenario: 优雅关闭保证不丢失
- **WHEN** 服务优雅关闭
- **THEN** SHALL 调用 StatsBuffer.Stop
- **THEN** SHALL 等待最后一次刷新完成
- **THEN** SHALL 保证统计数据不丢失
### Requirement: StatsRepository 支持批量更新
StatsRepository SHALL 新增 BatchUpdate 方法支持批量增量更新。
#### Scenario: BatchUpdate 更新现有记录
- **WHEN** 调用 BatchUpdate 且当日记录存在
- **THEN** SHALL 使用事务更新 request_count = request_count + delta
- **THEN** SHALL 不创建新记录
#### Scenario: BatchUpdate 创建新记录
- **WHEN** 调用 BatchUpdate 且当日记录不存在
- **THEN** SHALL 创建新记录request_count = delta
- **THEN** SHALL 使用事务保证原子性