FastAPI限流:实现选项
FastAPI作为一款高性能、易学习的现代Python Web框架,在处理高并发请求时,限流是保障系统稳定性的关键措施。本文将介绍FastAPI中实现限流的多种实用方案,帮助开发者根据项目需求选择最合适的策略。
为什么需要限流?
在高流量场景下,未加限制的请求可能导致服务器资源耗尽,影响服务可用性。限流能够:
- 防止恶意攻击(如DDoS)
- 保证服务质量(QoS)
- 避免资源过载
- 维护系统稳定性
图:FastAPI处理并发请求的示意图,展示了合理控制请求流量的重要性
FastAPI限流实现方案
1. 内置速率限制器
FastAPI的脚本工具中提供了基础的速率限制实现,如scripts/people.py中的RateLimiter类:
class RateLimiter:
def __init__(self) -> None:
self.remaining_points: int = 5000 # 总请求点数
self.reset_at: datetime = datetime.fromtimestamp(0, timezone.utc) # 重置时间
def __enter__(self) -> "RateLimiter":
# 计算等待时间以遵守速率限制
final_wait_time = ceil(max(primary_limit_wait_time, secondary_limit_wait_time))
time.sleep(max(final_wait_time, 1))
return self
这个实现通过计算请求成本和等待时间,有效控制API调用频率,适用于基础的限流需求。
2. 使用第三方库
对于更复杂的限流需求,推荐使用成熟的第三方库:
slowapi + limiter
from fastapi import FastAPI, Request, Depends
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
limiter = Limiter(key_func=get_remote_address)
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
@app.get("/limited")
@limiter.limit("5/minute")
async def limited_route(request: Request):
return {"message": "This route is rate limited"}
这种方式支持多种限流策略(如按IP、用户、API密钥等),并提供灵活的配置选项。
3. 自定义中间件实现
通过FastAPI的中间件功能,可以在请求处理前进行限流检查:
from fastapi import Request, FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
import time
class RateLimitMiddleware(BaseHTTPMiddleware):
def __init__(self, app, max_requests=100, time_window=60):
super().__init__(app)
self.max_requests = max_requests
self.time_window = time_window
self.clients = {} # 存储客户端请求信息
async def dispatch(self, request: Request, call_next):
client_ip = request.client.host
now = time.time()
# 清理过期记录
self.clients[client_ip] = [t for t in self.clients.get(client_ip, []) if t > now - self.time_window]
if len(self.clients[client_ip]) >= self.max_requests:
return JSONResponse(
status_code=429,
content={"detail": "Rate limit exceeded"}
)
self.clients[client_ip].append(now)
response = await call_next(request)
return response
app = FastAPI()
app.add_middleware(RateLimitMiddleware, max_requests=100, time_window=60)
限流策略选择指南
图:FastAPI应用部署架构,限流通常在API网关或应用层实现
按场景选择合适方案:
- 简单API保护:使用
slowapi库快速实现 - 分布式系统:考虑Redis+Celery实现分布式限流
- 高并发场景:使用专业限流服务如NGINX或API网关
- 内部服务:可采用内置
RateLimiter类的简化实现
关键参数配置:
- 请求频率:如"100次/分钟"
- 时间窗口:如60秒
- 限流粒度:IP、用户ID、API密钥等
- 响应策略:延迟处理、直接拒绝、排队等待
最佳实践
- 渐进式限流:从宽松限制开始,逐步调整至最佳值
- 监控与告警:设置限流触发告警,及时发现异常流量
- 优雅降级:限流时返回清晰的错误信息(HTTP 429)
- 文档说明:在API文档中明确说明限流规则
FastAPI的灵活性使得实现限流变得简单,无论是使用内置工具还是第三方库,都能找到适合项目需求的解决方案。合理配置限流策略,能有效保护你的API服务,确保系统在高负载下依然稳定可靠。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



