Frekvensbegränsning

Driftsättning av AI i produktion med FastAPI

Matt Eckerle

Software and Data Engineering Leader

Introduktion till frekvensbegränsning

ett trafikljus

 

  • Syfte: Styr hur ofta API-anrop får göras.
  • Svar: Returnerar HTTP 429 ("Too Many Requests") när gränsen överskrids.
Driftsättning av AI i produktion med FastAPI

Så fungerar frekvensbegränsning

Del 1 av flödesdiagrammet som förklarar frekvensbegränsning

Driftsättning av AI i produktion med FastAPI

Autentisering av inkommande uppgifter

Del 2 av flödesdiagrammet som förklarar frekvensbegränsning

Driftsättning av AI i produktion med FastAPI

Kontroll av frekvensbegränsning

Del 3 av flödesdiagrammet som förklarar frekvensbegränsning

Driftsättning av AI i produktion med FastAPI

Konfigurera vårt API

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import APIKeyHeader
from pydantic import BaseModel

app = FastAPI()
model = SentimentAnalyzer(pkl_file_path)

API_KEY_HEADER = APIKeyHeader(name="X-API-Key")
API_KEY = "your-secret-key"
Driftsättning av AI i produktion med FastAPI

Logiken bakom frekvensbegränsaren

from datetime import datetime, timedelta

class RateLimiter:
    def __init__(self, requests_per_min: int = 10):
        self.requests_per_min = requests_per_min
        self.requests = defaultdict(list)

def is_rate_limited( self, api_key: str ) -> tuple[bool, int]:

Del 1 av flödesdiagrammet över logiken bakom implementering av frekvensbegränsning

Driftsättning av AI i produktion med FastAPI

Ta bort gamla anrop

from datetime import datetime, timedelta

class RateLimiter:
    def __init__(self, requests_per_min: int = 10):
        self.requests_per_min = requests_per_min
        self.requests = defaultdict(list)

def is_rate_limited( self, api_key: str ) -> tuple[bool, int]:
now = datetime.now() minute_ago = now - timedelta(minutes=1) self.requests[api_key] = [ req_time for req_time in self.requests[api_key] if req_time > minute_ago ]

Del 2 av flödesdiagrammet som förklarar frekvensbegränsning

Driftsättning av AI i produktion med FastAPI

Kontrollera antalet anrop

    def is_rate_limited(self, api_key: str) -> 
  tuple[bool, int]:
        now = datetime.now()
        minute_ago = now - timedelta(minutes=1)

self.requests[api_key] = [ req_time for req_time in self.requests[api_key] if req_time > minute_ago ]
recent_requests = len(self.requests[api_key]) if recent_requests >= self.requests_per_min: return True, 0 self.requests[api_key].append(now) return False

Ett diagram som visar kontrollen av antalet API-anrop: om antalet är lika med eller överstiger gränsen returneras true, annars returneras false.

Driftsättning av AI i produktion med FastAPI

Lägg till kontroll av frekvensbegränsning

rate_limiter = RateLimiter(requests_per_minute=10)

def test_api_key(api_key: str = Depends(API_KEY_HEADER)): if api_key != API_KEY: raise HTTPException( status_code=403, detail="Invalid API key" ) is_limited, _ = rate_limiter.is_rate_limited(api_key) if is_limited: raise HTTPException( status_code=429, detail="Rate limit exceeded. Please try again later." ) return api_key
Driftsättning av AI i produktion med FastAPI

Tillämpa frekvensbegränsning på endpointen

@app.post("/predict")
def predict_sentiment(
    request: SentimentRequest,
    api_key: str = Depends(test_api_key)
):
    result = sentiment_model(request.text)

    _, requests_remaining = 
           rate_limiter.is_rate_limited(api_key)

    return {
        "text": request.text,
        "sentiment": result[0]["label"].lower(),
        "confidence": result[0]["score"],
        "requests_remaining": requests_remaining
    }

Skicka anropet 11 gånger:

curl -X POST "http://localhost:8000/predict" \
     -H "Content-Type: application/json" \
     -H "X-API-Key: your-secret-key" \
     -d '{"text": "I love this product"}'

Utdata:

{"detail":"Rate limit exceeded. 
           Please try again later."}
Driftsättning av AI i produktion med FastAPI

Nu kör vi en övning!

Driftsättning av AI i produktion med FastAPI

Preparing Video For Download...