Aller au contenu principal

Application des Quotas

STOA applique des quotas API par consumer au niveau du gateway — limites de débit (par seconde/minute), plafonds journaliers et limites mensuelles. Les quotas sont définis dans les plans d'abonnement et appliqués en temps réel.

Pipeline d'Application

Chaque requête API passe par la vérification de quota après l'authentification :

Types de Quota

TypeFenêtreExempleCas d'Usage
Par secondeGlissante 1s100 req/sProtection contre les rafales
Par minuteGlissante 1min1 000 req/minRate limiting en régime permanent
JournalierRéinitialisation à minuit UTC100 000 req/jourPlafonds d'utilisation journalière
MensuelRéinitialisation le 1er du mois1 000 000 req/moisLimites par période de facturation
RafaleInstantané50 simultanésPlafond de requêtes simultanées

Configuration des Plans

Les quotas sont définis par plan dans le Control Plane :

Configure your environment

The examples below use environment variables. Set them for your STOA instance:

export STOA_API_URL="https://api.gostoa.dev"       # Replace with your domain
export STOA_AUTH_URL="https://auth.gostoa.dev" # Keycloak OIDC provider
export STOA_GATEWAY_URL="https://mcp.gostoa.dev" # MCP Gateway endpoint

Self-hosted? Replace gostoa.dev with your domain.

curl -X POST "${STOA_API_URL}/v1/plans" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"slug": "gold",
"name": "Plan Gold",
"rate_limit_per_second": 100,
"rate_limit_per_minute": 5000,
"daily_request_limit": 500000,
"monthly_request_limit": 10000000,
"burst_limit": 50
}'

Exemples de Plans

PlanDébit/secDébit/minJournalierMensuel
Community56010 000100 000
Silver2030050 0001 000 000
Gold1005 000500 00010 000 000
EnterprisePersonnaliséPersonnaliséPersonnaliséPersonnalisé

En-têtes de Réponse

Chaque réponse réussie inclut des en-têtes de rate limit :

X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4523
X-RateLimit-Reset: 1708000123
En-têteDescription
X-RateLimit-LimitNombre maximum de requêtes autorisées dans la fenêtre courante
X-RateLimit-RemainingRequêtes restantes dans la fenêtre courante
X-RateLimit-ResetTimestamp Unix de réinitialisation de la fenêtre

Réponse d'Erreur (429)

Quand un quota est dépassé, le gateway retourne 429 Too Many Requests :

Rate limit dépassé :

{
"error": "quota_exceeded",
"message": "Rate limit dépassé : limite par minute de 100 requêtes atteinte",
"retry_after_secs": 45
}

Quota journalier dépassé :

{
"error": "quota_exceeded",
"message": "Quota journalier dépassé : 10000/10000 requêtes utilisées. Réinitialisation à minuit UTC.",
"retry_after_secs": null
}

L'en-tête Retry-After est également défini :

HTTP/1.1 429 Too Many Requests
Retry-After: 45
Content-Type: application/json

Comportement de Réinitialisation

Type de QuotaSe Réinitialise Quand
Par secondeAprès 1 seconde
Par minuteAprès 60 secondes
JournalierMinuit UTC (00:00 UTC)
Mensuel1er du mois (00:00 UTC)

Les réinitialisations sont automatiques — aucune intervention manuelle nécessaire. Le gateway vérifie la date/heure courante à chaque requête et réinitialise les compteurs quand la fenêtre change.

Monitoring des Quotas

Via l'API Admin

# Lister toutes les statistiques de quota des consumers
curl "${STOA_GATEWAY_URL}/admin/quotas" \
-H "Authorization: Bearer ${ADMIN_TOKEN}"
[
{
"consumer_id": "user-123",
"daily_count": 450,
"daily_limit": 1000,
"monthly_count": 12500,
"monthly_limit": 50000,
"daily_remaining": 550,
"monthly_remaining": 37500
}
]

Stats par Consumer

curl "${STOA_GATEWAY_URL}/admin/quotas/${CONSUMER_ID}" \
-H "Authorization: Bearer ${ADMIN_TOKEN}"

Réinitialiser les Quotas (Admin)

Pour le dépannage ou le support client, les admins peuvent réinitialiser les compteurs de quota d'un consumer :

curl -X POST "${STOA_GATEWAY_URL}/admin/quotas/${CONSUMER_ID}/reset" \
-H "Authorization: Bearer ${ADMIN_TOKEN}"

Cette opération réinitialise immédiatement les compteurs journaliers et mensuels à zéro.

Métriques Prometheus

Le gateway expose des métriques Prometheus liées aux quotas :

MétriqueTypeDescription
stoa_requests_totalCounterTotal des requêtes (par consumer, statut)
stoa_rate_limited_totalCounterRequêtes rejetées par le rate limiter
stoa_quota_exceeded_totalCounterRequêtes rejetées par le quota journalier/mensuel
stoa_quota_usage_ratioGaugeUtilisation courante en ratio (0.0-1.0)

Exemple d'Alerte Grafana

# Alerte quand un consumer atteint 80% de son quota journalier
- alert: QuotaNearLimit
expr: stoa_quota_usage_ratio{type="daily"} > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "Consumer {{ $labels.consumer_id }} à {{ $value | humanizePercentage }} du quota journalier"

Quotas par Défaut

Quand aucun plan n'est spécifié, le gateway applique des limites par défaut :

ParamètreValeur par Défaut
Débit par minute5 requêtes
Limite journalière10 000 requêtes

Ces valeurs par défaut protègent contre les abus pour les consumers sans plan explicite. Configurez des limites plus élevées en assignant un plan à l'abonnement.

Dépannage

ProblèmeCauseSolution
429 immédiatement à la première requêteQuota par défaut trop bas (5/min)Assigner un plan à l'abonnement
Quota non réinitialisé à minuitDécalage de fuseau horaireLes quotas se réinitialisent à minuit UTC
Consumer affiche 0 restant mais les requêtes fonctionnentDélai de cacheAttendre jusqu'à 5 minutes ou vider le cache
La réinitialisation admin du quota ne prend pas effetCache du gatewayVider le cache après la réinitialisation : POST /admin/cache/clear

Voir Aussi