如何判断何时对FastAPI应用进行纵向或横向扩容?
FastAPI 扩容时机判断与指标监控方案
核心思路
FastAPI本身不内置类似uWSGI的Max Workers/Idle Workers状态指标,但可以通过ASGI服务器(如Uvicorn、Hypercorn)的原生指标 + 自定义应用指标 + 系统资源指标来判断扩容时机,逻辑和你之前用uWSGI的思路一致——提前预警,而非等资源满载。
一、关键监控指标(替代uWSGI的Worker指标)
1. ASGI服务器层面指标
FastAPI依赖ASGI服务器运行,以最常用的Uvicorn为例,可监控以下核心指标:
- 总Worker数/活跃Worker数:类似uWSGI的
Max Workers/Idle Workers,当活跃Worker数持续接近总Worker数时,说明当前进程已无空闲能力处理新请求。 - 请求队列长度:Uvicorn会维护请求队列,当队列长度持续增长(比如超过总Worker数的2倍),意味着请求堆积,现有处理能力不足。
- 请求延迟(P95/P99):当95%/99%的请求响应时间显著上升,说明系统已处于高负载状态,需提前扩容。
2. 自定义应用层指标
可以通过Prometheus客户端库在FastAPI中添加自定义指标,更精准追踪应用状态:
- 处理中的请求数:实时反映当前系统的并发负载
- 各接口的请求成功率/错误率:异常请求激增也可能触发扩容需求
示例代码(添加Prometheus指标):
from fastapi import FastAPI from prometheus_client import Counter, Gauge, generate_latest from starlette.responses import PlainTextResponse app = FastAPI() # 自定义指标:处理中的请求数 in_progress_requests = Gauge("fastapi_in_progress", "Number of in-progress requests") # 总请求计数器 total_requests = Counter("fastapi_total_requests", "Total HTTP requests") @app.middleware("http") async def track_request_metrics(request, call_next): in_progress_requests.inc() total_requests.inc() response = await call_next(request) in_progress_requests.dec() return response # 暴露metrics端点供Prometheus抓取 @app.get("/metrics", responses={200: {"content": {"text/plain": {}}}}) async def metrics_endpoint(): return PlainTextResponse(generate_latest())
3. 系统资源指标
作为兜底补充,监控容器的:
- CPU使用率:单容器CPU持续超过70%-80%(可根据业务调整阈值)
- 内存使用率:单容器内存占用持续超过80%
- 网络带宽:进出流量接近容器/主机上限
二、纵向/横向扩容的判断时机
1. 纵向扩容(单容器内增加资源/Worker数)
- 触发条件:
- 活跃Worker数持续接近总Worker数,但容器的CPU/内存还有剩余空间
- 请求队列开始增长,但系统资源未满载
- 操作:
- 增加Uvicorn的Worker数(通过
--workers参数,建议设置为CPU核数的2倍左右) - 提升容器的CPU/内存配额(如Docker的
--cpus/--memory参数)
- 增加Uvicorn的Worker数(通过
2. 横向扩容(增加容器实例数量)
- 触发条件:
- 单容器的Worker数已拉满,CPU/内存持续处于高位(超过阈值)
- 请求队列持续增长,P95/P99延迟显著上升,即使纵向扩容也无法缓解
- 单容器的网络带宽已达上限
- 操作:
- 在负载均衡器(如Nginx)后新增FastAPI容器实例
- 配合自动扩缩容工具(如Kubernetes HPA),基于指标自动调整实例数量
三、落地建议
- 用Prometheus+Grafana搭建监控体系,将ASGI指标、自定义指标、系统指标统一可视化
- 为各指标设置告警阈值(比如活跃Worker数占比超过90%持续5分钟,触发告警)
- 优先通过纵向扩容快速缓解小幅度负载增长,当单容器资源触顶后再进行横向扩容
内容的提问来源于stack exchange,提问作者grayaii
相关产品推荐
相关产品推荐

