Limiter les requêtes d’API

Effectué

Il est courant de constater que quelques utilisateurs surutilisent une API. Parfois, une API est surutilisée à tel point que vous encourez des coûts supplémentaires ou que la réactivité aux autres utilisateurs est réduite. Vous pouvez utiliser une limitation de taux pour aider à protéger l’accès aux points de terminaison de l’API en restreignant le nombre de fois qu’une API peut être appelée dans un laps de temps spécifié.

Par exemple, l’API de recensement est distribuée à un grand nombre d’organismes publics, donc le nombre d’appels à l’API peut devenir significatif. En appliquant une stratégie de limite de débit, nous pouvons mettre en place une réponse rapide à toutes les demandes pour qu’il ne soit pas possible qu’un seul client utilise toutes les ressources de l’API de recensement.

Dans cette unité, vous allez apprendre à utiliser des stratégies Gestion des API pour imposer deux types de limitation.

Limitation sur les abonnements

Une limitation sur les abonnements vous permet de définir les limites de débit pour une opération d’API spécifique. Elle ne fait aucune distinction entre les clients. En effet, chaque requête adressée à l’API ou à l’opération spécifiée est limitée de la même façon. Dans notre exemple de recensement d’API, nous pourrions utiliser une limitation sur les abonnements pour limiter le nombre de fois où les API sont appelées au cours d’une certaine période. Avec cette configuration, les clients reçoivent une erreur 429 quand cette limite est atteinte. Le problème avec ce type de limitation est qu’il permet à un client d’utiliser toutes les requêtes avant qu’un autre client ne puisse les utiliser.

Par exemple, le code suivant illustre un exemple de configuration qui s’applique à toutes les opérations d’API. La limite est définie sur trois appels par période de 15 secondes :

<rate-limit calls="3" renewal-period="15" />

Vous pouvez aussi utiliser cette configuration pour cibler une opération d’API particulière :

<rate-limit calls="number" renewal-period="seconds">
    <api name="API name" id="API id" calls="number" renewal-period="seconds" />
        <operation name="operation name" id="operation id" calls="number" renewal-period="seconds" />
    </api>
</rate-limit>

Limitation sur les clés

Une limitation sur les clés vous permet de configurer différentes limites de débit pour chaque valeur de requête du client. Ce type de limitation offre un meilleur moyen de gérer les limites de débit, car il applique la limite à une clé de requête spécifiée, souvent l’adresse IP du client. Il donne à chaque client une même bande passante pour appeler l’API :

<rate-limit-by-key calls="number"
                   renewal-period="seconds"
                   increment-condition="condition"
                   counter-key="key value" />

L’exemple de configuration suivant définit la limite de débit en fonction de l’adresse IP d’une demande. Ici, la limite est définie sur 10 appels par période de 60 secondes :

<rate-limit-by-key calls="10"
              renewal-period="60"
              increment-condition="@(context.Response.StatusCode == 200)"
              counter-key="@(context.Request.IpAddress)"/>

Lorsque vous choisissez de limiter les clés, vous devez décider de critères spécifiques pour la limitation de débit. Par exemple, le tableau suivant liste trois façons courantes de spécifier la counter-key :

Value Description
context.Request.IpAddress Débits limités par adresse IP du client
context.Subscription.Id Débits limités par ID d’abonnement
context.Request.Headers.GetValue("My-Custom-Header-Value") Débits limités pour chaque valeur d’en-tête de requête de client spécifiée

Vous pourriez décider que chaque adresse IP de client ait son propre ensemble de bande passante, auquel cas vous utiliseriez context.Request.IpAddress. Vous pourriez aussi souhaiter que toutes les requêtes d’un nom de domaine particulier soient limitées, si certains domaines ont de nombreux appels à l’API. Dans ce cas, vous devez spécifier context.Request.Headers.GetValue("host"), qui limite le débit pour les domaines à partir desquels l’appel a été effectué.

Remarque

La stratégie <rate-limit-by-key> n’est pas disponible quand votre passerelle Gestion des API est dans le niveau Consommation. Vous pouvez utiliser <rate-limit> à la place.