[python] FastAPI에서 API 스로틀링 구현하기

FastAPI는 손쉽게 빠르고 효율적인 API를 구축할 수 있는 Python 프레임워크입니다. API 스로틀링은 클라이언트의 요청 속도를 제어하여 서버를 보호하고 과부하를 방지하는 중요한 기능입니다. 이번 포스트에서는 FastAPI에서 API 스로틀링을 구현하는 방법을 알아보겠습니다.

FastAPI의 RateLimitMiddleware 사용

FastAPI는 middlewares을 사용하여 API 요청을 가로채고 처리할 수 있습니다. 이를 활용하여 API 스로틀링을 구현할 수 있습니다. RateLimitMiddleware를 사용하여 손쉽게 API 요청을 제한할 수 있습니다.

from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi_throttling import ThrottlingMiddleware

app = FastAPI()

origins = [
    "http://localhost",
    "http://localhost:8080",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 1분 동안 100개의 요청으로 제한
app.add_middleware(ThrottlingMiddleware, request_processing_rate=100, time_interval=60)

@app.get("/api/data")
async def get_data(request: Request):
    return {"data": "Some data"}

위 코드에서 ThrottlingMiddleware는 1분 동안 최대 100개의 요청을 허용합니다. 따라서 동일한 클라이언트로부터의 101번째 요청은 거부됩니다.

사용자 지정 스로틀링 규칙

FastAPI의 ThrottlingMiddleware를 사용하면 기본적인 스로틀링 규칙을 적용할 수 있습니다. 그러나 때로는 보다 세부적인 스로틀링 규칙이 필요할 수 있습니다. 이를 위해 FastAPI는 사용자 지정 스로틀링 규칙을 구현할 수 있는 기능을 제공합니다.

from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi_throttling import ThrottlingMiddleware, Rule

app = FastAPI()

origins = [
    "http://localhost",
    "http://localhost:8080",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

rules = [
    Rule(name="default", rate=100, interval=60),
    Rule(name="special", rate=10, interval=10, path="/api/special"),
]

app.add_middleware(ThrottlingMiddleware, rules=rules)

@app.get("/api/data")
async def get_data(request: Request):
    return {"data": "Some data"}

@app.get("/api/special")
async def get_special_data(request: Request):
    return {"data": "Special data"}

위 코드에서 Rule 객체를 사용하여 사용자 지정 스로틀링 규칙을 정의할 수 있습니다. 예를 들어, /api/special 경로에 대해서는 10초 동안 최대 10개의 요청만을 허용하는 규칙을 지정할 수 있습니다.

결론

FastAPI의 RateLimitMiddleware를 사용하면 API 스로틀링을 손쉽게 구현할 수 있습니다. 기본적인 스로틀링 규칙 외에도 사용자 지정 스로틀링 규칙을 정의하여 더 세부적인 제어도 가능합니다. 이를 통해 서버의 안정성을 높이고 과부하를 방지할 수 있습니다.

더 자세한 내용은 FastAPI 공식 문서를 참조해 주세요.