1. 百万级任务处理架构设计原理
FastAPI 处理高并发任务的核心是异步 I/O 模型 和任务队列解耦。当每秒请求量超过 10 万时,同步阻塞模式会导致服务器崩溃,而 FastAPI 的异步特性配合消息队列可实现:
- 请求接收与任务执行分离
- 水平扩展任务处理节点
- 失败任务自动重试
graph LR
A[客户端请求] --> B[FastAPI 接收端点]
B --> C[消息队列 RabbitMQ/Celery]
C --> D[Worker 集群处理]
D --> E[(数据库/存储)]
2. 异步任务处理实现方案
2.1 后台任务基础配置
python
# 安装依赖:fastapi==0.109.0 celery==5.3.6 pydantic==2.6.4 redis==4.6.0
from fastapi import BackgroundTasks, FastAPI
from pydantic import BaseModel
app = FastAPI()
class TaskRequest(BaseModel):
data: str # 任务数据负载
def _execute_task(data: str):
# 模拟耗时操作(如调用AI模型)
import time
time.sleep(0.5)
print(f"Processed: {data}")
@app.post("/tasks")
async def create_task(request: TaskRequest, bg: BackgroundTasks):
bg.add_task(_execute_task, request.data)
return {"message": "Task queued"}
2.2 分布式任务队列进阶
python
# celery_worker.py
from celery import Celery
from pydantic import BaseModel
celery_app = Celery('worker', broker='redis://localhost:6379/0')
class AIRequest(BaseModel):
prompt: str
max_tokens: int = 100
@celery_app.task
def process_ai_task(request: dict):
from ai_model import generate_text # 假设的AI服务
req = AIRequest(**request)
return generate_text(req.prompt, req.max_tokens)
# main.py
from celery_worker import celery_app
from fastapi import FastAPI
app = FastAPI()
@app.post("/ai-task")
async def ai_task_endpoint(request: AIRequest):
# 异步提交到Celery
task = celery_app.send_task('process_ai_task', kwargs=request.dict())
return {"task_id": task.id}
3. 性能优化关键策略
3.1 水平扩展方案
组件 | 扩展方式 | QPS 提升效果 |
---|---|---|
API 服务 | Kubernetes Pod | 线性增长 |
Worker | Celery 多节点 | 10x |
消息队列 | RabbitMQ 集群 | 100x |
3.2 资源隔离配置
python
# 为CPU密集型任务单独分配进程
@celery_app.task(acks_late=True, queue='cpu_intensive')
def image_processing_task(...):
...
# 在FastAPI中指定队列
@app.post("/image-task")
async def create_image_task():
celery_app.send_task(..., queue='cpu_intensive')
4、性能优化关键技术
4.1. 任务分片处理
flowchart TB
A[大型任务] --> B[任务分割器]
B --> C[子任务1]
B --> D[子任务2]
B --> E[子任务...]
C --> F[结果聚合]
D --> F
E --> F
F --> G[最终结果]
4.2. 弹性扩展方案
- 横向扩展:增加Celery Worker实例
- 垂直扩展:调整单个Worker并发数
- 自动扩缩容:基于队列长度动态调整
4.3. 流量控制
python
# 限流中间件示例
@app.middleware("http")
async def rate_limitter(request: Request, call_next):
if not allow_request(request):
return JSONResponse(status_code=429)
return await call_next(request)
5. 课后 Quiz
问题: 当任务处理节点宕机时,如何保证不丢失任务?
选项:
A) 使用数据库持久化任务
B) 配置消息队列的持久化存储
C) 启用Celery的acks_late参数
查看答案 正确答案:B和C组合使用 - B选项:RabbitMQ的持久化队列确保消息不丢失 - C选项:acks_late=True 只在任务完成后确认,避免处理中丢失 - A选项不适用,因为数据库操作本身可能失败
6. 常见报错解决方案
报错: ConnectionResetError: [WinError 10054]
原因: 客户端在任务完成前断开连接
解决方案:
python
# 添加心跳检测机制
@app.post("/task")
async def safe_task(bg: BackgroundTasks):
bg.add_task(_execute, heartbeat_timeout=30) # 30秒超时重试
报错: Celery TaskRevokedError
原因: Worker 处理超时
修复方案:
python
@celery_app.task(time_limit=120) # 设置2分钟超时
def long_running_task():
...