mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-01 01:30:04 +08:00
5.7 KiB
5.7 KiB
权限检查系统优化方案
当前设计分析
优点
- ✅ 模块化设计,每个检查独立
- ✅ 并行执行检查,提高效率
- ✅ 有超时控制和重试机制
- ✅ 有缓存降级策略
- ✅ 有并发控制(信号量)
存在的问题
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: 金币检查
→ 超时不影响其他检查
实现要点
- 统一数据上下文
@dataclass
class AuthContext:
"""统一管理所有需要的数据"""
plugin: PluginInfo
user: UserConsole
group: GroupConsole | None
bot_id: str
entity: EntityIDs
# ... 其他数据
- 早期退出机制
# 阶段1检查
for check in critical_checks:
result = await execute_check(check)
if not result.success:
raise result.error # 立即退出,不执行后续检查
- 检查结果缓存
# 对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) 调整检查顺序
# 在 auth_checker.py 中调整检查顺序
# 1. 先执行ban检查(如果失败,立即退出)
# 2. 再执行其他检查
b) 统一数据获取
# 在auth函数开始处,统一获取所有需要的数据
plugin, user, group = await gather_all_data(...)
# 然后传递给各个检查函数
c) 添加检查结果缓存
# 对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天)
- 分析当前检查函数的依赖关系
- 确定优先级划分
- 设计统一的数据上下文
阶段2:实现(3-5天)
- 实现优先级机制
- 实现早期退出机制
- 实现检查结果缓存
- 统一错误处理
阶段3:测试(2-3天)
- 单元测试
- 集成测试
- 性能测试
- 压力测试
阶段4:部署(1天)
- 灰度发布
- 监控性能指标
- 逐步全量
风险评估
低风险
- 调整检查顺序
- 添加缓存
- 统一数据获取
中风险
- 实现优先级机制(需要充分测试)
- 早期退出机制(可能影响某些边界情况)
高风险
- 架构级重构(需要完整的测试覆盖)
建议
- 先实施低风险优化:立即调整检查顺序,添加缓存
- 逐步实施中风险优化:实现优先级机制,充分测试
- 长期规划高风险优化:根据实际需求决定是否进行架构级重构
参考实现
详见 auth_checker_optimized.py(设计示例,仅供参考)