[python] FastAPI에서 빠른 API 응답 시간을 위한 튜닝 방법

FastAPI는 빠른 API 응답 시간을 제공하는 강력한 웹 프레임워크입니다. 그러나 몇 가지 튜닝을 통해 더욱 빠른 응답 시간을 달성할 수 있습니다. 이번 블로그 포스트에서는 FastAPI에서 API 응답 시간을 향상시키는 몇 가지 유용한 팁을 소개하겠습니다.

1. 빠른 ASGI 서버 사용

FastAPI는 기본적으로 Uvicorn ASGI 서버를 사용합니다. 그러나 더 빠른 ASGI 서버인 daphne이나 hypercorn을 사용하여 응답 시간을 개선할 수 있습니다. 다음은 hypercorn을 사용하는 예시입니다.

import uvicorn
from myapp import app

if __name__ == "__main__":
    uvicorn.run(app, server='hypercorn', host='0.0.0.0', port=8000)

2. 쿼리 파라미터 유효성 검사 최소화

FastAPI는 자동으로 요청의 쿼리 파라미터 유효성을 검사하므로 잘못된 입력을 처리하는 데 시간이 소요될 수 있습니다. 따라서 반드시 필요한 경우에만 쿼리 파라미터 유효성 검사를 수행하고, 불필요한 검사를 피하는 것이 좋습니다.

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    # 유효성 검사 수행하지 않음
    items = get_items_from_db(skip=skip, limit=limit)
    return items

3. 비동기 작업 최적화

FastAPI는 비동기 작업을 효율적으로 처리할 수 있도록 지원합니다. 병렬 처리가 필요한 작업은 async 키워드를 사용하여 비동기 함수로 작성하고 await를 통해 작업이 완료될 때까지 대기합니다.

@app.get("/items/")
async def read_items():
    items = await get_items_from_db()
    return items

4. 데이터베이스 연결 풀링 사용

데이터베이스 연결에는 시간이 걸릴 수 있으므로, FastAPI에서는 데이터베이스 연결 풀링을 사용하는 것이 좋습니다. 데이터베이스 연결 풀링은 미리 연결을 생성해 놓고 재사용하여 빠른 응답 시간을 유지합니다.

import databases

database = databases.Database("sqlite:///mydatabase.db", min_size=5, max_size=20)

5. 캐싱 사용

응답 결과를 캐싱하여 동일한 요청에 대한 응답 시간을 단축시킬 수 있습니다. FastAPI에서는 cachetools 라이브러리를 사용하여 캐싱을 구현할 수 있습니다.

from cachetools import cached, TTLCache

cache = TTLCache(maxsize=1000, ttl=300)

@cached(cache)
def heavy_computation():
    # 복잡한 계산 작업
    return result

위의 팁을 활용하여 FastAPI의 API 응답 시간을 향상시킬 수 있습니다. 하지만 응답 시간을 높이는 방법은 상황에 따라 다를 수 있으므로, 최적의 방법을 찾기 위해 약간의 실험이 필요할 수 있습니다.

FastAPI 공식 문서 및 FastAPI GitHub 저장소에서 더 많은 정보를 찾아볼 수 있습니다.