mirror of
https://github.com/Nezumi-2711/astrbot_plugin_qq_group_daily_analysis.git
synced 2026-09-23 04:09:59 +00:00
refactor(perf): 建立三级资源防线并优化并发限流配置
- 【异常处理优化】引入自定义任务重复异常,精准区分“因重复运行而跳过”与“实际分析取消”两种不同语义,提升调度健壮性。
- 【三级并发控制架构】针对不同层级的资源消耗,建立了完整的限流保护体系:
- 入口层:控制同时处于活跃状态的任务总数,防止瞬时加载大量消息导致服务器内存溢出 (OOM);
- 接口层:全局限制 LLM API 并发请求数,确保严格遵守服务商的频率限制 (RPM);
- 渲染层:全局限制浏览器图片生成进程,保护物理 CPU 与内存不被高能耗渲染任务耗尽。
- 【配置体验升级】新增「并发限流设置」配置组,统一收纳核心性能参数,并提供面向普通用户的防坑说明与更稳健的默认值。
- 【代码清理】移除陈旧的兼容逻辑与冗余参数,统一配置命名规范。
- 【功能精化】重排增量分析逻辑,确保在任务入口与分段处理流程中均有可靠的信号量保护。
- 【细节完善】优化群文件及群相册上传设置的文案描述,明确功能支持范围与权限要求。
This commit is contained in:
@@ -24,6 +24,12 @@ from ...infrastructure.persistence.incremental_store import IncrementalStore
|
||||
from ...utils.logger import logger
|
||||
|
||||
|
||||
class DuplicateGroupTaskError(Exception):
|
||||
"""当同一个群组在同一时间尝试启动相同类型的重复分析任务时抛出。"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
class AnalysisApplicationService:
|
||||
"""分析应用服务 - 协调业务流程(每日分析 + 增量分析)"""
|
||||
|
||||
@@ -50,7 +56,8 @@ class AnalysisApplicationService:
|
||||
self.incremental_merge_service = incremental_merge_service
|
||||
self._locks = weakref.WeakValueDictionary()
|
||||
# 全局 LLM 分析信号量,控制对外 API 的并发压力
|
||||
max_concurrent = self.config_manager.get_max_concurrent_tasks()
|
||||
# 使用专用的 LLM 并发配置项
|
||||
max_concurrent = self.config_manager.get_llm_max_concurrent()
|
||||
self.llm_semaphore = asyncio.Semaphore(max_concurrent)
|
||||
|
||||
@asynccontextmanager
|
||||
@@ -61,17 +68,18 @@ class AnalysisApplicationService:
|
||||
"""
|
||||
lock_key = f"{task_type}:{group_id}"
|
||||
|
||||
# 获取或创建该群专属的异步锁
|
||||
lock = self._locks.get(lock_key)
|
||||
if lock is None:
|
||||
lock = asyncio.Lock()
|
||||
self._locks[lock_key] = lock
|
||||
# 获取或创建该群组特有的锁
|
||||
if lock_key not in self._locks:
|
||||
self._locks[lock_key] = asyncio.Lock()
|
||||
lock = self._locks[lock_key]
|
||||
|
||||
# 检查是否已经锁定(防止并发)
|
||||
# 检查是否已经锁定(防止并发现实)
|
||||
# 说明:在 asyncio 中,虽然是单线程,但设计上应避免阻塞等待非预期的任务。
|
||||
# 这里使用 locked() 检查并立即抛出异常,实现“跳过”而非“排队”。
|
||||
if lock.locked():
|
||||
logger.warning(f"群 {group_id} 的 {task_type} 任务已在运行,跳过本次请求")
|
||||
# 这里抛出异常以便上层识别并优雅跳过
|
||||
raise asyncio.CancelledError(f"Duplicate task for {lock_key}")
|
||||
# 使用自定义异常以便上层识别并优雅跳过,同时不影响真实的任务取消语义
|
||||
raise DuplicateGroupTaskError(f"Duplicate task for {lock_key}")
|
||||
|
||||
async with lock:
|
||||
logger.debug(f"[Lock] 已获取群 {group_id} 的 {task_type} 排他锁")
|
||||
|
||||
Reference in New Issue
Block a user