feat: add async worker queues and retry controls

This commit is contained in:
wren
2026-04-29 11:48:09 +08:00
parent e738398eb6
commit f3b83c9979
16 changed files with 1316 additions and 96 deletions
+50
View File
@@ -0,0 +1,50 @@
"""Celery 应用入口。"""
from __future__ import annotations
from celery import Celery
from kombu import Queue
from fastapi_admin.config import (
LEAUDIT_TASK_SOFT_TIME_LIMIT,
LEAUDIT_TASK_TIME_LIMIT,
LEAUDIT_WORKER_QUEUE_NORMAL,
LEAUDIT_WORKER_QUEUE_URGENT,
REDIS_DB,
REDIS_HOST,
REDIS_PASSWORD,
REDIS_PORT,
)
def _build_redis_url() -> str:
"""拼接 Redis broker / backend 连接串。"""
auth = f":{REDIS_PASSWORD}@" if REDIS_PASSWORD else ""
return f"redis://{auth}{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}"
celery_app = Celery(
"leaudit_platform",
broker=_build_redis_url(),
backend=_build_redis_url(),
)
celery_app.conf.update(
task_default_queue=LEAUDIT_WORKER_QUEUE_NORMAL,
task_queues=(
Queue(LEAUDIT_WORKER_QUEUE_URGENT),
Queue(LEAUDIT_WORKER_QUEUE_NORMAL),
),
task_track_started=True,
task_acks_late=True,
worker_prefetch_multiplier=1,
broker_connection_retry_on_startup=True,
task_soft_time_limit=LEAUDIT_TASK_SOFT_TIME_LIMIT,
task_time_limit=LEAUDIT_TASK_TIME_LIMIT,
)
celery_app.autodiscover_tasks(
[
"fastapi_modules.fastapi_leaudit.leaudit_bridge",
]
)
+19
View File
@@ -54,6 +54,25 @@ LEAUDIT_RULES_DIR: str
LEAUDIT_RESCUE_MODE: str
LEAUDIT_LLM_MAX_CONCURRENCY: int
LEAUDIT_VLM_MAX_CONCURRENCY: int
LEAUDIT_LLM_REQUEST_TIMEOUT: int
LEAUDIT_LLM_RETRY_MAX_ATTEMPTS: int
LEAUDIT_LLM_RETRY_BACKOFF_BASE_SECONDS: float
LEAUDIT_VLM_REQUEST_TIMEOUT: int
LEAUDIT_VLM_RETRY_MAX_ATTEMPTS: int
LEAUDIT_VLM_RETRY_BACKOFF_BASE_SECONDS: float
LEAUDIT_OCR_VLM_CONCURRENCY: int
LEAUDIT_OCR_RETRY_MAX_ATTEMPTS: int
LEAUDIT_OCR_RETRY_BACKOFF_BASE_SECONDS: float
LEAUDIT_SIGNATURE_PROBE_CONCURRENCY: int
LEAUDIT_SIGNATURE_PROBE_TIMEOUT: int
LEAUDIT_SIGNATURE_PROBE_RETRY_MAX_ATTEMPTS: int
LEAUDIT_SIGNATURE_PROBE_RETRY_BACKOFF_BASE_SECONDS: float
LEAUDIT_WORKER_QUEUE_URGENT: str
LEAUDIT_WORKER_QUEUE_NORMAL: str
LEAUDIT_WORKER_CONCURRENCY: int
LEAUDIT_RUN_LOCK_SECONDS: int
LEAUDIT_TASK_SOFT_TIME_LIMIT: int
LEAUDIT_TASK_TIME_LIMIT: int
# 常量
ROOT_PATH: object
+19
View File
@@ -94,6 +94,25 @@ class LeauditSettings(_Base):
LEAUDIT_RESCUE_MODE: str = "auto"
LEAUDIT_LLM_MAX_CONCURRENCY: int = 5
LEAUDIT_VLM_MAX_CONCURRENCY: int = 3
LEAUDIT_LLM_REQUEST_TIMEOUT: int = 120
LEAUDIT_LLM_RETRY_MAX_ATTEMPTS: int = 3
LEAUDIT_LLM_RETRY_BACKOFF_BASE_SECONDS: float = 1.0
LEAUDIT_VLM_REQUEST_TIMEOUT: int = 90
LEAUDIT_VLM_RETRY_MAX_ATTEMPTS: int = 2
LEAUDIT_VLM_RETRY_BACKOFF_BASE_SECONDS: float = 1.0
LEAUDIT_OCR_VLM_CONCURRENCY: int = 3
LEAUDIT_OCR_RETRY_MAX_ATTEMPTS: int = 3
LEAUDIT_OCR_RETRY_BACKOFF_BASE_SECONDS: float = 1.0
LEAUDIT_SIGNATURE_PROBE_CONCURRENCY: int = 2
LEAUDIT_SIGNATURE_PROBE_TIMEOUT: int = 20
LEAUDIT_SIGNATURE_PROBE_RETRY_MAX_ATTEMPTS: int = 2
LEAUDIT_SIGNATURE_PROBE_RETRY_BACKOFF_BASE_SECONDS: float = 0.5
LEAUDIT_WORKER_QUEUE_URGENT: str = "leaudit.urgent"
LEAUDIT_WORKER_QUEUE_NORMAL: str = "leaudit.normal"
LEAUDIT_WORKER_CONCURRENCY: int = 2
LEAUDIT_RUN_LOCK_SECONDS: int = 1800
LEAUDIT_TASK_SOFT_TIME_LIMIT: int = 3300
LEAUDIT_TASK_TIME_LIMIT: int = 3600
# 实例化所有 Settings