FastAPI的BackgroundTasks如何玩转生产者-消费者模式?

1. BackgroundTasks 底层实现

FastAPI 的 BackgroundTasks 基于 Starlette 的 background task 实现,采用同步执行机制。当请求处理完成后,框架会顺序执行注册的后台任务。这种设计保证了:

  • 任务执行与响应返回的时序性
  • 异常任务的隔离处理
  • 请求上下文的安全访问
python 复制代码
from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

def log_operation(operation: str):
    with open("audit.log", "a") as f:
        f.write(f"{datetime.now()} - {operation}\n")

@app.post("/transactions")
async def create_transaction(
    task: TransactionSchema,
    background_tasks: BackgroundTasks
):
    background_tasks.add_task(log_operation, f"New transaction {task.id}")
    return {"status": "processing"}

2. 生产者-消费者模式演进

当系统面临以下场景时需升级架构:

  • 单节点任务处理能力达到瓶颈
  • 需要保证任务执行的顺序性
  • 要求任务执行结果的可追溯性
graph TD A[客户端请求] --> B[API 接收请求] B --> C{立即响应} C --> D[生产者存入队列] D --> E[Redis/RabbitMQ] E --> F[消费者读取任务] F --> G[任务处理模块] G --> H[结果持久化]

分布式任务处理实现

1. 架构组件配置

python 复制代码
# requirements.txt
celery==5.3.0
pydantic==1.10.7
redis==4.5.5

2. 生产者服务实现

python 复制代码
from celery import Celery
from pydantic import BaseModel

class TaskPayload(BaseModel):
    user_id: int
    content: str
    priority: int = 1

celery_app = Celery('worker', broker='redis://localhost:6379/0')

@app.post("/tasks")
async def create_task(
    payload: TaskPayload,
    background_tasks: BackgroundTasks
):
    background_tasks.add_task(
        celery_app.send_task,
        'process_task',
        kwargs=payload.dict()
    )
    return {"task_id": str(uuid.uuid4())}

3. 消费者服务实现

python 复制代码
@celery_app.task(name='process_task')
def process_task(user_id: int, content: str, priority: int):
    try:
        result = ContentProcessor().analyze(content)
        TaskResult.objects.create(
            user_id=user_id,
            content=content,
            result=result
        )
        return {"status": "success"}
    except AnalysisError as e:
        logger.error(f"Processing failed: {str(e)}")
        raise self.retry(exc=e, countdown=30)

异常处理机制

python 复制代码
@app.exception_handler(CeleryError)
async def celery_error_handler(request: Request, exc: CeleryError):
    return JSONResponse(
        status_code=503,
        content={"message": "Task system temporarily unavailable"}
    )

发现1000+提升效率与开发的AI工具和实用程序tools.cmdragon.cn/

课后 Quiz

问题 1 :当使用 Redis 作为消息代理时,如何保证任务不丢失? 答案解析

  1. 启用 Redis 持久化配置 (AOF + RDB)
  2. 设置任务确认机制 (acks_late=True)
  3. 实现死信队列处理机制

问题 2 :如何实现任务优先级处理? 答案解析

  1. 在 Celery 配置中设置 task_routes
  2. 使用不同队列对应不同优先级
  3. 消费者启动时指定优先级参数:
bash 复制代码
celery -A worker worker -Q high_prio,low_prio -c 4

常见报错处理

错误现象TaskRevokedError: Task revoked before execution

解决方案

  1. 检查 Celery 的 worker 日志确认终止原因
  2. 增加任务超时配置:
python 复制代码
@celery_app.task(bind=True, soft_time_limit=60)
def process_task(self):
    ...
  1. 实现任务状态追踪中间件

预防建议

  1. 监控系统内存使用情况
  2. 设置合理的任务超时阈值
  3. 使用任务进度上报机制
相关推荐
衝鋒壹号3 分钟前
鸿蒙 PC 能跑 Docker 吗?一次从安装失败到成功运行的实测记录
后端·harmonyos
ShineWinsu5 分钟前
对于Git:远程操作的超详细保姆级解析
linux·git·gitee·github·远程仓库·分布式版本控制系统·远程操作
用户8181870627468 分钟前
第27章 消息丢失/重复消费的全链路排查(生产者→Broker→消费者)
java·后端
程序员cxuan8 分钟前
ChatGPT 开启无限 token
人工智能·后端·程序员
Gopher_HBo13 分钟前
beego ORM 源码(上):模型元数据与注册
后端
索隆zoro23 分钟前
Army 对 jOOQ
java·后端
泡海椒28 分钟前
规则热更新实现:JQuick-Java无需重启更新业务规则实战
后端
Gu0Qiang39 分钟前
从 0 到 1 打造 AI 提示流编排器:条件分支路由、Kahn 图剪枝与 HTTP 节点实战(开源系列 06)
人工智能·github
右耳朵猫AI1 小时前
PHP周刊2026W37 | Symfony 三维护版齐发、Laravel AI SDK 0.11、LSP 服务器上线
后端·php·laravel
geovindu1 小时前
CSharp:Condition Variable Pattern
后端·设计模式·c#·.net·.netcore·条件变量模式·同步型模式