You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断何时对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数)

  • 触发条件:
    1. 活跃Worker数持续接近总Worker数,但容器的CPU/内存还有剩余空间
    2. 请求队列开始增长,但系统资源未满载
  • 操作:
    • 增加Uvicorn的Worker数(通过--workers参数,建议设置为CPU核数的2倍左右)
    • 提升容器的CPU/内存配额(如Docker的--cpus/--memory参数)

2. 横向扩容(增加容器实例数量)

  • 触发条件:
    1. 单容器的Worker数已拉满,CPU/内存持续处于高位(超过阈值)
    2. 请求队列持续增长,P95/P99延迟显著上升,即使纵向扩容也无法缓解
    3. 单容器的网络带宽已达上限
  • 操作:
    • 在负载均衡器(如Nginx)后新增FastAPI容器实例
    • 配合自动扩缩容工具(如Kubernetes HPA),基于指标自动调整实例数量

三、落地建议

  1. 用Prometheus+Grafana搭建监控体系,将ASGI指标、自定义指标、系统指标统一可视化
  2. 为各指标设置告警阈值(比如活跃Worker数占比超过90%持续5分钟,触发告警)
  3. 优先通过纵向扩容快速缓解小幅度负载增长,当单容器资源触顶后再进行横向扩容

内容的提问来源于stack exchange,提问作者grayaii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:05:30