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. 使用任务进度上报机制
相关推荐
Slow菜鸟9 分钟前
Spring Cloud 教程(四) | OpenFeign 的作用
后端·spring·spring cloud
张二娃同学11 分钟前
Claude Code 使用教程:下载安装、CC Switch 配置、MiniMax API 获取与启动实操
人工智能·windows·深度学习·github·claude code
GetcharZp11 分钟前
告别付费云盘!这款开源 AI 相册神器,颜值与实力双飞,满足你对私人云端的一切幻想!
后端
华仔啊20 分钟前
写简历太痛苦?这个开源项目用 AI 帮你一键搞定
github
朦胧之20 分钟前
AI 编程工具使用浅谈
前端·后端
架构谨制@涛哥43 分钟前
《哥谭神话-Palantir故事篇》Palantir 产品战略与架构全景
后端·系统架构·软件构建
Flandern11111 小时前
Go程序员学习AI大模型项目实战02:给 AI 装上“大脑”:从配置解包到流式生成的深度拆解
人工智能·后端·python·学习·golang
70asunflower1 小时前
个人主页从 0 到 1:Jekyll + GitHub Pages + AI Agent 完全指南
github·个人主页
无限进步_1 小时前
【C++】重载、重写和重定义的区别详解
c语言·开发语言·c++·ide·windows·git·github
历程里程碑1 小时前
1 . Git本地操作:版本控制 跨平台协作 仓库核心
java·开发语言·数据结构·c++·git·gitee·github