P0: - rpm_override 嵌入 Auth Cache Snapshot,消除每请求 DB 查询 (snapshot v6→v7) - 429 RPM 响应返回 Retry-After 头(当前分钟剩余秒数) P1: - ClearAll 按钮直连 DELETE API,带 loading 防重复 - 新增 GET /admin/users/:id/rpm-status 管理员 RPM 用量查询端点 优化: - checkRPM 从级联互斥改为并行取最严,user.rpm_limit 作为全局硬上限始终生效 - Override/Group 变更后自动失效 auth cache - fail-open 语义不变,Redis 故障不阻塞业务
26 lines
1.3 KiB
Go
26 lines
1.3 KiB
Go
package service
|
||
|
||
import "context"
|
||
|
||
// UserRPMCache 用户/分组级 RPM 计数器接口。
|
||
//
|
||
// 与账号级 RPMCache 的区别:
|
||
// - RPMCache —— 按外部 AI provider 账号聚合(key: rpm:{accountID}:{min})。
|
||
// - UserRPMCache —— 按用户或 (用户, 分组) 聚合,杜绝"同一用户创建多个 API Key 绕过 RPM"的路径。
|
||
// key 形如 rpm:ug:{userID}:{groupID}:{min} 或 rpm:u:{userID}:{min}。
|
||
type UserRPMCache interface {
|
||
// IncrementUserGroupRPM 原子递增 (user, group) 级分钟计数并返回最新值。
|
||
// 用于分组 rpm_limit 与 user-group rpm_override 两种命中分支。
|
||
IncrementUserGroupRPM(ctx context.Context, userID, groupID int64) (count int, err error)
|
||
|
||
// IncrementUserRPM 原子递增用户级分钟计数并返回最新值。
|
||
// 用于用户全局 rpm_limit 兜底分支(分组未设且无 override 时)。
|
||
IncrementUserRPM(ctx context.Context, userID int64) (count int, err error)
|
||
|
||
// GetUserGroupRPM 获取 (user, group) 当前分钟已用 RPM(只读,不递增)。
|
||
GetUserGroupRPM(ctx context.Context, userID, groupID int64) (count int, err error)
|
||
|
||
// GetUserRPM 获取用户当前分钟已用 RPM(只读,不递增)。
|
||
GetUserRPM(ctx context.Context, userID int64) (count int, err error)
|
||
}
|