Skip to content

Limitation de débit et contrôle de contre-pression

Préface

Le jour du Double Onze à minuit, des centaines de millions d'utilisateurs se ruent simultanément — le serveur peut-il résister ? Tout système a une capacité de traitement maximale. Lorsque le volume de requêtes dépasse la capacité du système, sans contrôle, le résultat est que personne ne peut l'utiliser. La limitation de débit et la contre-pression sont les deux lignes de défense qui protègent le système contre la surcharge.

Que allez-vous apprendre dans cet article ?

Après avoir étudié ce chapitre, vous serez en mesure de :

  • Comprendre la nécessité de la limitation : comprendre pourquoi il faut refuser activement certaines requêtes pour protéger le système
  • Maîtriser les algorithmes de limitation : comprendre les principes et les différences des trois algorithmes clés : seau à jetons, seau à fuite, fenêtre glissante
  • Mécanisme de contre-pression : comprendre les stratégies de traitement lorsque la vitesse amont dépasse la vitesse aval
  • Limitation multi-niveaux : découvrir l'architecture de limitation multi-niveaux du client à la passerelle et au service
  • Capacité pratique : savoir quelle stratégie de limitation choisir dans quel scénario
ChapitreContenuConcept clé
Chapitre 1Pourquoi la limitation est nécessaireEffet avalanche, protection des services
Chapitre 2Algorithmes de limitationSeau à jetons, seau à fuite, fenêtre glissante
Chapitre 3Contrôle de contre-pressionTampon, stratégie de rejet, mise à l'échelle élastique
Chapitre 4Architecture de limitation multi-niveauxClient, passerelle, côté serveur
Chapitre 5Pratique et sélectionNginx, Redis, Sentinel

0. Vue d'ensemble : pourquoi « refuser » des utilisateurs ?

Cela semble contre-intuitif — ne devrions-nous pas servir au mieux chaque utilisateur ? Mais la réalité est que sans refuser certaines requêtes, toutes les requêtes échoueront.

Imaginez un restaurant qui ne peut accueillir que 100 personnes et où 1 000 personnes se ruent soudainement à l'intérieur. Sans limitation de débit, le résultat n'est pas que les 1 000 personnes pourront manger, mais que la cuisine s'effondre, les serveurs sont paralysés, et personne ne peut manger. La bonne approche est de limiter le flux à l'entrée en faisant patienter les autres, en laissant entrer les 100 premières personnes.

Objectif principal de la limitation de débit

  • Protéger le système : éviter la surcharge qui rendrait le service totalement indisponible
  • Allocation équitable : garantir que les requêtes acceptées puissent être traitées normalement
  • Dégradation gracieuse : les requêtes limitées reçoivent un code d'état 429 explicite, plutôt qu'un délai d'attente ou une erreur 500

1. Algorithmes de limitation : trois solutions classiques

Le problème central de la limitation est : dans un intervalle de temps donné, combien de requêtes sont autorisées au maximum à passer ? Les différents algorithmes offrent des compromis entre précision, gestion du trafic en rafale et complexité de mise en œuvre.

Rate Limiting Algorithm Comparison
Choose an algorithm, then send requests to observe the effect
Passed0
Rejected0
Tokens left5
Token bucket
Adds tokens to the bucket at a fixed rate. Each request consumes one token, and extra tokens are discarded when the bucket is full. It allows bursts when stored tokens are available.
AlgorithmePrincipeTrafic en rafalePrécisionComplexité de mise en œuvre
Seau à jetonsDébit fixe de jetons, les requêtes consomment des jetonsAutorisé (si le seau a un stock)ÉlevéeMoyenne
Seau à fuiteLes requêtes sont mises en file d'attente, traitement à débit fixeNon autorisé (lissage complet)ÉlevéeMoyenne
Fenêtre glissanteComptage des requêtes dans la fenêtrePartiellement autoriséAssez élevéeFaible
Fenêtre fixeComptage par fenêtre temporelleRafale possible aux limitesFaibleLa plus faible

Quel algorithme choisir ?

  • Limitation d'API : le seau à jetons est le plus courant, il autorise des rafales raisonnables
  • Façonnage du trafic : le seau à fuite convient aux scénarios nécessitant un débit de sortie constant
  • Comptage simple : la fenêtre glissante est simple à implémenter et convient à la plupart des applications Web

2. Contrôle de contre-pression : quand l'amont est plus rapide que l'aval

La limitation de débit résout le problème des « requêtes externes trop nombreuses », tandis que la contre-pression (Backpressure) résout le problème de « la vitesse des composants internes ne correspond pas ».

Lorsque le producteur produit des données plus rapidement que le consommateur ne peut les traiter, le tampon intermédiaire ne cesse de grossir, entraînant finalement un débordement de mémoire ou une perte de données. Le mécanisme de contre-pression permet au consommateur de « notifier en retour » le producteur pour qu'il ralentisse.

Backpressure Control
What happens when production is faster than consumption?
Produce rate:6/s
Consume rate:3/s
Producer
6/s
Buffer (0/20)
Running normally
Consumer
3/s
Backpressure strategies:
Drop strategy
Drop new data directly when the buffer is full
Example: log collection, real-time metrics
Blocking strategy
Make producers wait when the buffer is full
Example: Go channels, Java BlockingQueue
Sampling strategy
Process only part of the data and skip the rest
Example: downsampling high-frequency sensor data
Elastic scaling
Dynamically increase the number of consumers
Example: Kubernetes HPA autoscaling

Quatre stratégies de contre-pression

  1. Rejet (Drop) : lorsque le tampon est plein, rejeter les nouvelles ou les anciennes données, adapté aux scénarios où l'exigence de temps réel est élevée mais la perte est acceptable
  2. Blocage (Block) : mettre en pause le producteur jusqu'à ce que le consommateur ait terminé, adapté aux scénarios où les données ne peuvent pas être perdues
  3. Échantillonnage (Sample) : ne traiter qu'une partie des données, adapté aux flux de données à haute fréquence
  4. Mise à l'échelle élastique (Scale) : augmenter dynamiquement le nombre de consommateurs, adapté aux environnements natifs cloud

3. Architecture de limitation multi-niveaux

En production, la limitation de débit à un seul point ne suffit pas ; il faut une protection multi-niveaux, chaque niveau résolvant un problème de granularité différent.

NiveauPositionGranularité de limitationOutils
ClientFrontend/AppAnti-rebond de bouton, limitation de requêteslodash.throttle, debounce
CDN/WAFNœud de périphérieNiveau IP, niveau régionalCloudflare Rate Limiting
Passerelle APIPasserelle d'entréeNiveau de route, niveau utilisateurNginx limit_req, Kong
Côté serveurApplication interneNiveau d'interface, niveau de ressourceSentinel, Resilience4j
Base de donnéesCouche de stockageNombre de connexions, QPSConfiguration du pool de connexions, coupure des requêtes lentes

Spécification HTTP pour la limitation

Les requêtes limitées doivent renvoyer le code d'état 429 Too Many Requests et inclure dans les en-têtes de réponse :

  • Retry-After : délai suggéré avant une nouvelle tentative (en secondes ou date)
  • X-RateLimit-Limit : plafond de limitation
  • X-RateLimit-Remaining : quota restant
  • X-RateLimit-Reset : heure de réinitialisation du quota

4. Sélection pratique

ScénarioSolution recommandéeDescription
Limitation à l'entrée Nginxlimit_req_zoneBasé sur l'algorithme du seau à fuite, configuration simple
Limitation distribuéeRedis + script LuaSeau à jetons ou fenêtre glissante, comptage partagé entre instances
Microservices JavaSentinel / Resilience4jSupporte la coupure de circuit, la dégradation, la limitation des points chauds
API Node.jsexpress-rate-limitSimple d'utilisation, supporte le stockage Redis
Service Gogolang.org/x/time/rateImplémentation standard du seau à jetons

Résumé

La limitation de débit et la contre-pression sont les deux lignes de défense clés pour protéger la stabilité du système. La limitation de débit contrôle la vitesse d'afflux du trafic externe, tandis que la contre-pression coordonne la vitesse de traitement des composants internes.

Récapitulatif des points clés de ce chapitre :

  1. Nécessité de la limitation : sans refuser certaines requêtes, toutes les requêtes échoueront
  2. Trois algorithmes clés : seau à jetons (autorise les rafales), seau à fuite (lissage complet), fenêtre glissante (simple et précis)
  3. Mécanisme de contre-pression : quatre stratégies — rejet, blocage, échantillonnage, mise à l'échelle
  4. Protection multi-niveaux : du client à la base de données, chaque niveau résout un problème de granularité différent
  5. Spécification 429 : en cas de limitation, renvoyer le code d'état standard et les en-têtes de limitation

Pour aller plus loin