Pembatasan Laju

Menerapkan AI ke Produksi dengan FastAPI

Matt Eckerle

Software and Data Engineering Leader

Mengenal pembatasan laju

sebuah lampu lalu lintas

 

  • Tujuan: Mengontrol frekuensi permintaan API.
  • Respons: Mengembalikan HTTP 429 ("Terlalu Banyak Permintaan") saat batas terlewati.
Menerapkan AI ke Produksi dengan FastAPI

Cara kerja pembatasan laju

Bagian 1 dari diagram alur yang menjelaskan pembatasan laju

Menerapkan AI ke Produksi dengan FastAPI

Mengautentikasi kredensial masuk

Bagian 2 dari diagram alur yang menjelaskan pembatasan laju

Menerapkan AI ke Produksi dengan FastAPI

Pemeriksaan pembatasan laju

Bagian 3 dari diagram alur yang menjelaskan pembatasan laju

Menerapkan AI ke Produksi dengan FastAPI

Menyiapkan API kita

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"
Menerapkan AI ke Produksi dengan FastAPI

Logika rate limiter

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]:

Bagian 1 dari diagram alur logika penerapan pembatasan laju

Menerapkan AI ke Produksi dengan FastAPI

Menghapus permintaan lama

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 ]

Bagian 2 dari diagram alur yang menjelaskan pembatasan laju

Menerapkan AI ke Produksi dengan FastAPI

Periksa jumlah permintaan

    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

Diagram yang merepresentasikan pemeriksaan jumlah permintaan oleh API: jika jumlah di atas atau sama dengan batas, kembalikan true, jika tidak kembalikan false.

Menerapkan AI ke Produksi dengan FastAPI

Tambahkan pemeriksaan batas laju

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
Menerapkan AI ke Produksi dengan FastAPI

Terapkan batas laju pada endpoint

@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
    }

Kirim permintaan 11 kali:

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"}'

Keluaran:

{"detail":"Rate limit exceeded. 
           Please try again later."}
Menerapkan AI ke Produksi dengan FastAPI

Ayo berlatih!

Menerapkan AI ke Produksi dengan FastAPI

Preparing Video For Download...