refactor: 全面重构核心架构,消除反复修改的根因
- 删除 ValidationQueue 双轨持久化队列,替换为纯内存 AsyncWorkerPool - 引入统一后台任务框架 JobExecutor(Job/CrawlJob/ValidateAllJob) - 新增 PluginRunner 统一插件执行(超时、重试、健康检查、统计) - 重构 SchedulerService 职责收敛为仅定时触发 ValidateAllJob - 使用 AsyncExitStack 重构 lifespan,安全管理长生命周期资源 - 路由层瘦身 50%+,业务异常上抛由全局中间件统一处理 - 实现设置全热更新(WorkerPool 并发、Validator 超时即时生效) - 前端 Store 强制写后重新拉取,消除乐观更新数据不同步 - 删除 queue.py / task_repo.py / task_service.py - 新增 execution 单元测试,全部 85 个测试通过
This commit is contained in:
@@ -3,7 +3,7 @@ from fastapi import APIRouter, Request
|
||||
from app.core.db import get_db
|
||||
from app.repositories.settings_repo import SettingsRepository
|
||||
from app.models.schemas import SettingsSchema
|
||||
from app.api.common import success_response, error_response
|
||||
from app.api.common import success_response
|
||||
from app.core.log import logger
|
||||
|
||||
router = APIRouter(prefix="/api/settings", tags=["settings"])
|
||||
@@ -22,14 +22,32 @@ async def save_settings(request: SettingsSchema, http_request: Request):
|
||||
async with get_db() as db:
|
||||
success = await settings_repo.save(db, request.model_dump())
|
||||
if not success:
|
||||
return error_response("保存设置失败", 500)
|
||||
raise RuntimeError("保存设置失败")
|
||||
|
||||
# 热更新运行中调度器的间隔时间
|
||||
scheduler = getattr(http_request.app.state, "scheduler_service", None)
|
||||
if scheduler and scheduler.running:
|
||||
scheduler = getattr(http_request.app.state, "scheduler", None)
|
||||
worker_pool = getattr(http_request.app.state, "worker_pool", None)
|
||||
validator = getattr(http_request.app.state, "validator", None)
|
||||
|
||||
if scheduler:
|
||||
new_interval = request.validate_interval_minutes
|
||||
if scheduler.interval_minutes != new_interval:
|
||||
scheduler.interval_minutes = new_interval
|
||||
logger.info(f"Scheduler interval updated to {new_interval} minutes")
|
||||
|
||||
# 热更新 Worker 池大小
|
||||
if worker_pool and worker_pool.worker_count != request.default_concurrency:
|
||||
await worker_pool.resize(request.default_concurrency)
|
||||
logger.info(f"Worker pool resized to {request.default_concurrency}")
|
||||
|
||||
# 热更新验证器超时和并发(下次验证时生效)
|
||||
if validator:
|
||||
validator._init_timeout = request.validation_timeout
|
||||
validator._init_connect_timeout = request.validation_timeout
|
||||
validator._init_max_concurrency = request.default_concurrency
|
||||
# 重新创建 semaphore 和 session
|
||||
validator._semaphore = None
|
||||
await validator.close()
|
||||
logger.info(f"Validator config updated: timeout={request.validation_timeout}, concurrency={request.default_concurrency}")
|
||||
|
||||
return success_response("保存设置成功", request.model_dump())
|
||||
|
||||
Reference in New Issue
Block a user