<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êtetarget_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.
- Définissez des règles de quota distinctes, une pour chaque point de terminaison cible "Target-US" et
"Target-EU"
- Utilisez les éléments
<Class>
ou<Identifier>
pour vous assurer que plusieurs compteurs uniques sont utilisés.