Antimodèle : réutiliser une règle de quota

<ph type="x-smartling-placeholder"></ph> Vous consultez la documentation Apigee Edge.
Accédez à la page Documentation sur Apigee X.
En savoir plus

Apigee Edge offre la possibilité de configurer le nombre de requêtes autorisées pour un proxy d'API pour une période spécifique à l'aide des règles relatives aux quotas ;

Antimodèle

Si une règle de quota est réutilisée, le compteur de quotas est diminué chaque fois que la règle de quota est exécutée indépendamment de son emplacement. Autrement dit, si une règle de quota est réutilisée :

  • Dans le même flux ou dans différents flux d'un proxy d'API
  • Sur différents points de terminaison cibles d'un proxy d'API

Le compteur de quota diminue ensuite chaque fois que la règle est exécutée, et des erreurs de violation du quota sont envoyées bien plus tôt que prévu pour l'intervalle de temps spécifié.

Utilisons l'exemple suivant pour expliquer ce fonctionnement.

Proxy d'API

Imaginons que nous ayons un proxy d'API nommé "TestTargetServerQuota", qui achemine le trafic vers deux selon le chemin d'accès à la ressource. Nous aimerions limiter le trafic de l'API à 10 requêtes par minute pour chacun de ces serveurs cibles. Voici le tableau qui illustre scénario suivant:

Chemin d'accès à la ressource Serveur cible Quota
/target-us target-US.somedomain.com 10 requêtes par minute
/target-eu target-EU.somedomain.com 10 requêtes par minute

Règles de quotas

Étant donné que le quota de trafic est le même pour les deux serveurs cibles, nous définissons des règles de quota uniques nommé "Quota-Minute-Target-Server", comme indiqué ci-dessous:

<!-- /antipatterns/examples/1-8.xml -->
<Quota name="Quota-Minute-Target-Server">
  <Interval>1</Interval>
  <TimeUnit>minute</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="10"/>
</Quota>

Points de terminaison cibles

Utilisons la règle de quota "Quota-Minute-Target-Server" dans le Preflow du point de terminaison cible "Target-US" :

<!-- /antipatterns/examples/1-9.xml -->
<TargetEndpoint name="Target-US">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

Réutiliser la même règle de quota "Quota-Minute-Target-Server" dans le Preflow de l'autre cible du point de terminaison "Target-EU" :

<!-- /antipatterns/examples/1-10.xml -->
<TargetEndpoint name="Target-EU">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  <Response/>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

Modèle de trafic entrant

Supposons que nous recevions un total de 10 requêtes API pour ce proxy d'API dans les 30 premières secondes de le format suivant:

Chemin d'accès à la ressource /target-us /target-eu Tous
Nombre de requêtes 4 6 10

Un peu plus tard, nous obtenons la 11e requête API avec le chemin d'accès à la ressource /target-us. au bout de 32 secondes.

La requête devrait aboutir, car il reste six requêtes API pour le point de terminaison cible target-us, conformément au quota autorisé.

Cependant, nous recevons l'erreur Quota violation error.

Motif : Comme nous utilisons la même règle de quota pour les deux points de terminaison cibles, un compteur de quota unique est utilisé pour effectuer le suivi des requêtes API qu'ils reçoivent. Ainsi, le quota de 10 requêtes par minute est épuisé par les deux points de terminaison cibles, et non par un seul.

Impact

Cet antimodèle peut être la cause d'une différence importante entre les attentes de l'utilisateur et le nombre de requêtes réellement traitées, et donner l'impression que les limites de quota ont été atteintes trop tôt.

Bonne pratique

  • Utilisez les éléments <Class> ou <Identifier> pour vous assurer que plusieurs compteurs uniques sont utilisés pour une règle de quota donnée. Redéfinir la règle de quota « Quota-Minute-Target-Server » que nous venons d’expliquer dans la section précédente en utilisant l’en-tête target_id comme <Identifier> pour, comme indiqué ci-dessous:
    <!-- /antipatterns/examples/1-11.xml -->
    <Quota name="Quota-Minute-Target-Server">
      <Interval>1</Interval>
      <TimeUnit>minute</TimeUnit>
      <Allow count="10"/>
      <Identifier ref="request.header.target_id"/>
      <Distributed>true</Distributed>
    </Quota>
    
    • Nous continuerons à appliquer cette règle de quota aux points de terminaison cibles "Target-US" et "Target-EU" comme précédemment.
    • Supposons maintenant que si l'en-tête target_id a la valeur "US", les requêtes sont acheminées vers le point de terminaison cible "Target-US".
    • De même, si l'en-tête target_id a la valeur "EU", les requêtes sont acheminées vers la cible. "Target-EU".
    • Ainsi, même si nous utilisons la même règle de quota pour les deux points de terminaison cibles, des compteurs de quota distincts sont utilisés en fonction de la valeur <Identifier>.
    • Par conséquent, utiliser l'élément <Identifier> garantit que chacun des points de terminaison cibles dispose du quota autorisé de 10 requêtes.
  • Utilisez une règle de quota distincte pour chacun des flux, points de terminaison cibles ou proxys d'API pour vous assurer de toujours disposer du nombre autorisé de requêtes API. Regardons à présent l'exemple utilisé dans la ci-dessus pour voir comment atteindre le quota autorisé de 10 requêtes pour chaque cible les points de terminaison.
    • Définissez des règles de quota distinctes, une pour chaque point de terminaison cible "Target-US" et "Target-EU"

      Règle de quota pour le point de terminaison cible "Target-US" :

      <!-- /antipatterns/examples/1-12.xml -->
      <Quota name="Quota-Minute-Target-Server-US">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>
      

      Règle de quota pour le point de terminaison cible "Target-EU" :

      <!-- /antipatterns/examples/1-13.xml -->
      <Quota name="Quota-Minute-Target-Server-EU">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>
      
    • Utilisez la règle de quota correspondante dans la définition des points de terminaison cibles, comme montré ci-dessous :

      Point de terminaison cible "Target-US" :

      <!-- /antipatterns/examples/1-14.xml -->
      <TargetEndpoint name="Target-US">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-US</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-us.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>
      

      Point de terminaison cible "Target-EU" :

      <!-- /antipatterns/examples/1-15.xml -->
      <TargetEndpoint name="Target-EU">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-EU</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-eu.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>
      
    • Étant donné que nous utilisons des règles de quota distinctes dans les points de terminaison cibles "Target-US" et "Target-EU", un compteur distinct est créé. Ainsi, nous disposons du quota autorisé de 10 requêtes API par minute pour chacun des points de terminaison cibles.
  • Utilisez les éléments <Class> ou <Identifier> pour vous assurer que plusieurs compteurs uniques sont utilisés.