refactor: align auth checker optimization with DataAccess caching

This commit is contained in:
HibiKier
2025-12-17 15:03:44 +08:00
parent 0939013a89
commit 26150c2924
4 changed files with 1237 additions and 0 deletions
@@ -0,0 +1,234 @@
# 权限检查系统优化方案
## 当前设计分析
### 优点
1. ✅ 模块化设计,每个检查独立
2. ✅ 并行执行检查,提高效率
3. ✅ 有超时控制和重试机制
4. ✅ 有缓存降级策略
5. ✅ 有并发控制(信号量)
### 存在的问题
#### 1. **缺乏优先级机制**
- 所有检查并行执行,没有优先级区分
- ban检查应该优先执行,如果用户被ban,其他检查就不需要执行
- 浪费计算资源
#### 2. **缺乏早期退出机制**
- 即使某个检查已经失败,其他检查仍然会继续执行
- 例如:用户被ban了,但金币检查、限制检查等仍然会执行
#### 3. **数据获取分散**
- 每个检查函数可能都需要查询数据库
- 缺乏统一的数据上下文管理
- 可能导致重复查询
#### 4. **错误处理不一致**
- 有些检查超时时抛出异常
- 有些检查超时时只是记录日志继续执行
- 缺乏统一的错误处理策略
#### 5. **缺乏检查结果缓存**
- 对于相同的请求(相同的user_id, group_id, plugin),可能会重复执行相同的检查
- ban检查、bot检查等结果可以缓存一段时间
## 优化方案
### 方案1:优先级分层检查(推荐)
#### 核心思想
将检查分为多个优先级阶段,高优先级检查失败时立即退出,不执行后续检查。
#### 检查优先级划分
```
阶段1(CRITICAL - 关键检查):
- auth_ban: 用户/群组ban检查
- auth_bot: Bot状态检查
→ 如果失败,立即退出
阶段2(HIGH - 高优先级):
- auth_plugin: 插件状态检查
- auth_group: 群组状态检查
→ 并行执行,任一失败则退出
阶段3(MEDIUM - 中等优先级):
- auth_admin: 管理员权限检查
- auth_limit: 限制检查
→ 并行执行,任一失败则退出
阶段4(LOW - 低优先级):
- auth_cost: 金币检查
→ 超时不影响其他检查
```
#### 实现要点
1. **统一数据上下文**
```python
@dataclass
class AuthContext:
"""统一管理所有需要的数据"""
plugin: PluginInfo
user: UserConsole
group: GroupConsole | None
bot_id: str
entity: EntityIDs
# ... 其他数据
```
2. **早期退出机制**
```python
# 阶段1检查
for check in critical_checks:
result = await execute_check(check)
if not result.success:
raise result.error # 立即退出,不执行后续检查
```
3. **检查结果缓存**
```python
# 对ban、bot等检查结果进行缓存
cache_key = f"ban:{user_id}:{group_id}:{module}"
if cached_result := get_cached_result(cache_key):
return cached_result
```
### 方案2:责任链模式
#### 核心思想
使用责任链模式,按优先级顺序执行检查,任一检查失败则中断链。
#### 优点
- 清晰的检查顺序
- 易于添加新的检查
- 支持动态调整检查顺序
#### 缺点
- 无法充分利用并行执行的优势
- 可能增加总体执行时间
### 方案3:混合模式(最佳实践)
#### 核心思想
结合优先级和并行执行:
- 关键检查(ban、bot)串行执行,失败立即退出
- 同优先级检查并行执行
- 不同优先级按顺序执行
## 具体优化建议
### 1. 立即实施的优化(低风险)
#### a) 调整检查顺序
```python
# 在 auth_checker.py 中调整检查顺序
# 1. 先执行ban检查(如果失败,立即退出)
# 2. 再执行其他检查
```
#### b) 统一数据获取
```python
# 在auth函数开始处,统一获取所有需要的数据
plugin, user, group = await gather_all_data(...)
# 然后传递给各个检查函数
```
#### c) 添加检查结果缓存
```python
# 对ban检查结果缓存30秒
@lru_cache(maxsize=1000, ttl=30)
async def check_ban_cached(user_id, group_id):
return await is_ban(user_id, group_id)
```
### 2. 中期优化(需要重构)
#### a) 实现优先级机制
- 将检查函数注册到优先级系统
- 按优先级顺序执行
- 高优先级失败时立即退出
#### b) 统一错误处理
- 定义统一的检查结果类型
- 所有检查返回统一格式的结果
- 统一的超时处理策略
### 3. 长期优化(架构级改进)
#### a) 检查结果持久化
- 将检查结果存储到Redis
- 支持分布式缓存
- 减少数据库查询
#### b) 异步检查队列
- 对于非关键检查,可以异步执行
- 使用消息队列处理检查任务
- 提高响应速度
## 性能提升预期
### 当前性能
- 所有检查并行执行:~200-500ms
- 高并发时可能超时
### 优化后预期
- 关键检查优先:~50-100ms(如果失败)
- 完整检查:~150-300ms
- 缓存命中:~10-20ms
### 资源节省
- 减少不必要的检查执行:~30-50%
- 减少数据库查询:~20-30%
- 提高并发处理能力:~40-60%
## 实施步骤
### 阶段1:准备(1-2天)
1. 分析当前检查函数的依赖关系
2. 确定优先级划分
3. 设计统一的数据上下文
### 阶段2:实现(3-5天)
1. 实现优先级机制
2. 实现早期退出机制
3. 实现检查结果缓存
4. 统一错误处理
### 阶段3:测试(2-3天)
1. 单元测试
2. 集成测试
3. 性能测试
4. 压力测试
### 阶段4:部署(1天)
1. 灰度发布
2. 监控性能指标
3. 逐步全量
## 风险评估
### 低风险
- 调整检查顺序
- 添加缓存
- 统一数据获取
### 中风险
- 实现优先级机制(需要充分测试)
- 早期退出机制(可能影响某些边界情况)
### 高风险
- 架构级重构(需要完整的测试覆盖)
## 建议
1. **先实施低风险优化**:立即调整检查顺序,添加缓存
2. **逐步实施中风险优化**:实现优先级机制,充分测试
3. **长期规划高风险优化**:根据实际需求决定是否进行架构级重构
## 参考实现
详见 `auth_checker_optimized.py`(设计示例,仅供参考)