Règle SpikeArrest

Vous consultez la documentation d'Apigee Edge.
Accédez à la documentation sur Apigee X.
info

Icône SpikeArrest de l'interface utilisateur Edge

La règle SpikeArrest protège contre les surcharges de trafic à l'aide de l'élément <Rate>. Cet élément limite le nombre de requêtes traitées par un proxy d'API et envoyées à un backend, ce qui protège contre les délais de latence et les temps d'arrêt.

Élément <SpikeArrest>

Définit la règle SpikeArrest.

Valeur par défaut Consultez l'onglet Règles par défaut ci-dessous.
Obligatoire ? Facultatif
Type Objet complexe
Élément parent Non disponible
Éléments enfants <Identifier>
<MessageWeight>
<Rate> (Obligatoire)
<UseEffectiveCount>

Syntaxe

L'élément <SpikeArrest> utilise la syntaxe suivante :

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <DisplayName>display_name</DisplayName>
  <Properties/>
  <Identifier ref="flow_variable"/>
  <MessageWeight ref="flow_variable"/>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

Règle par défaut

L'exemple suivant présente les paramètres par défaut lorsque vous ajoutez une règle d'arrêt des pics à votre flux dans l'interface utilisateur Edge:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1">
  <DisplayName>Spike Arrest-1</DisplayName>
  <Properties/>
  <Identifier ref="request.header.some-header-name"/>
  <MessageWeight ref="request.header.weight"/>
  <Rate>30ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

Cet élément possède les attributs suivants qui sont communs à toutes les règles :

Attribut Par défaut Obligatoire ? Description
name N/A Obligatoire

Nom interne de la règle. La valeur de l'attribut name peut contenir des lettres, des chiffres, des espaces, des tirets, des traits de soulignement et des points. Cette valeur ne peut pas dépasser 255 caractères.

Vous pouvez également utiliser l'élément <DisplayName> pour ajouter un libellé à la règle dans l'éditeur de proxy de l'interface utilisateur de gestion avec un nom différent, en langage naturel.

continueOnError faux Facultatif Défini sur "false" pour renvoyer une erreur en cas d'échec d'une règle. Il s'agit du comportement attendu pour la plupart des règles. Défini sur "true" pour que l'exécution du flux se poursuive même après l'échec d'une règle.
enabled vrai Facultatif Défini sur "true" pour appliquer la règle. Défini sur "false" pour "désactiver" la règle. La règle ne sera pas appliquée même si elle reste associée à un flux.
async   faux Obsolète Cet attribut est obsolète.

Exemples

Les exemples suivants illustrent certaines des méthodes d'utilisation la règle SpikeArrest :

Exemple 1

Dans l'exemple suivant, la fréquence est définie sur cinq requêtes par seconde :

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

La règle lisse le débit pour obtenir une requête autorisée toutes les 200 millisecondes (1 000 / 5).

Exemple 2

Dans l'exemple suivant, le débit est défini sur 300 requêtes par minute:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

Le débit effectif est de 300 ppm, ce qui signifie qu'un nouveau jeton est ajouté au bucket toutes les 200 millisecondes. La taille du bucket est toujours configurée sur 10% de messagesPerPeriod. Par conséquent, avec une valeur messagesPerPeriod de 300, la taille du bucket est de 30 jetons.

Exemple 3

L'exemple suivant limite le nombre de requêtes à 12 par minute (une requête autorisée toutes les cinq secondes, ou 60 / 12) :

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

De plus, l'élément <MessageWeight> accepte une valeur personnalisée (l'en-tête weight) qui ajuste les pondérations des messages pour des applications ou des clients spécifiques. Cela permet de mieux contrôler la limitation du débit pour les entités identifiées avec l'élément <Identifier>.

Exemple 4

L'exemple suivant demande à SpikeArrest de rechercher une valeur d'exécution définie via la requête transmise en tant que variable de flux request.header.runtime_rate :

<SpikeArrest name="Spike-Arrest-1">
  <Rate ref="request.header.runtime_rate" />
</SpikeArrest>

La valeur de la variable de flux doit être au format intpm ou intps.

Pour essayer cet exemple, exécutez une requête semblable à celle-ci :

curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'

Référence d'élément enfant

Cette section décrit les éléments enfants de <SpikeArrest>.

<DisplayName>

Utilisez-le, en plus de l'attribut name, pour appliquer un libellé à la règle dans l'éditeur de proxys de l'interface de gestion en utilisant un nom différent et plus naturel.

L'élément <DisplayName> est commun à toutes les règles.

Valeur par défaut N/A
Requis ? Facultatif. Si vous omettez <DisplayName>, la valeur de l'attribut name de la règle est utilisée.
Type Chaîne
Élément parent <PolicyElement>
Éléments enfants Aucun

L'élément <DisplayName> utilise la syntaxe suivante :

Syntaxe

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

Exemple

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

L'élément <DisplayName> ne comporte aucun attribut ni élément enfant.

<Identifier>

Elle vous permet de choisir comment regrouper les requêtes afin de pouvoir appliquer la règle SpikeArrest en fonction du client. Par exemple, vous pouvez regrouper les requêtes par ID de développeur, auquel cas les requêtes de chaque développeur compteront pour leur propre débit SpikeArrest, et non toutes les requêtes adressées au proxy.

Utilisez cette option conjointement avec l'élément <MessageWeight> pour un contrôle plus précis de la limitation du nombre de requêtes.

Si vous laissez l'élément <Identifier> vide, une limite de débit est appliquée à toutes les requêtes adressées à ce proxy d'API.

Valeur par défaut N/A
Obligatoire ? Facultatif
Type Chaîne
Élément parent <SpikeArrest>
Éléments enfants Aucun

Syntaxe

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Identifier ref="flow_variable"/>
</SpikeArrest>
        

Exemple 1

L'exemple suivant applique la règle SpikeArrest par ID de développeur :

<SpikeArrest name="Spike-Arrest-1">
  <Identifier ref="developer.id"/>
  <Rate>42pm</Rate/>
</SpikeArrest>

Le tableau suivant décrit les attributs de <Identifier> :

Attribut Description Par défaut Présence
ref Identifie la variable selon laquelle SpikeArrest regroupe les requêtes entrantes. Vous pouvez utiliser n'importe quelle variable de flux pour indiquer un client unique, telles que celle disponible dans la règle VerifyAPIKey. Vous pouvez également définir des variables personnalisées à l'aide de la règle JavaScript ou de la règle AssignMessage. n/a Obligatoire

Cet élément est également abordé dans le post destiné à la communauté Apigee suivant : http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.

<MessageWeight>

Indique la pondération définie pour chaque message. La pondération des messages modifie l'impact d'une requête unique sur le calcul du taux Spike Arrest. La pondération du message peut être n'importe quelle variable de flux, telle qu'un en-tête HTTP, un paramètre de requête, un paramètre de formulaire ou le contenu du corps du message. Vous pouvez également utiliser des variables personnalisées à l'aide de la règle JavaScript ou de la règle AssignMessage.

Celles-ci sont à utiliser conjointement avec <Identifier> pour limiter davantage les requêtes de clients ou d'applications spécifiques.

Par exemple, si le <Rate> de SpikeArrest est de 10pm et qu'une application envoie des requêtes avec une pondération de 2, seuls cinq messages par minute sont autorisés en provenance de ce client, car chaque requête compte pour deux.

Valeur par défaut N/A
Obligatoire ? Facultatif
Type Entier
Élément parent <SpikeArrest>
Éléments enfants Aucun

Syntaxe

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <MessageWeight ref="flow_variable"/>
</SpikeArrest>

Exemple 1

L'exemple suivant limite le nombre de requêtes à 12 par minute (une requête autorisée toutes les cinq secondes, ou 60 / 12) :

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

Dans cet exemple, <MessageWeight> accepte une valeur personnalisée (l'en-tête weight dans la requête) qui ajuste les pondérations des messages pour des clients spécifiques. Cela permet de mieux contrôler la limitation du débit pour les entités identifiées avec l'élément <Identifier>.

Le tableau suivant décrit les attributs de <MessageWeight> :

Attribut Description Présence Par défaut
ref Identifie la variable de flux qui contient la pondération du message pour le client spécifique. Il peut s'agir de n'importe quelle variable de flux, telle qu'un paramètre de requête HTTP, un en-tête ou le contenu du corps du message. Pour en savoir plus, consultez la documentation de référence sur les variables de flux. Vous pouvez également définir des variables personnalisées à l'aide de la règle JavaScript ou de la règle AssignMessage. Obligatoire N/A

<Rate>

Indique le débit limite des pics de trafic (ou d'utilisation intensive) en définissant le nombre de requêtes autorisées par minute ou par seconde. Vous pouvez également utiliser cet élément conjointement avec <Identifier> et <MessageWeight> afin de limiter de manière fluide le trafic au moment de l'exécution en acceptant les valeurs du client.

Valeur par défaut N/A
Obligatoire ? Obligatoire
Type Entier
Élément parent <SpikeArrest>
Éléments enfants Aucun

Syntaxe

Vous pouvez spécifier les débits de l'une des manières suivantes :

  • Un débit statique que vous spécifiez comme corps de l'élément <Rate>
  • Une valeur variable qui peut être transmise par le client ; identifiez le nom de la variable de flux à l'aide de l'attribut ref
<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
</SpikeArrest>

Les valeurs de débit valides (définies en tant que valeur variable ou dans le corps de l'élément) doivent respecter le format suivant :

  • intps (nombre de requêtes par seconde, lissé sur des intervalles de quelques millisecondes)
  • intpm (nombre de requêtes par minute, lissé sur des intervalles de quelques secondes)

La valeur de int doit être un entier positif non nul.

Exemple 1

Dans l'exemple suivant, le débit est défini sur cinq requêtes par seconde :

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

La règle lisse le débit pour obtenir une requête autorisée toutes les 200 millisecondes (1 000 / 5).

Exemple 2

Dans l'exemple suivant, le débit est défini sur 12 requêtes par minute :

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

Cet exemple de règle lisse le débit pour obtenir une requête autorisée toutes les cinq secondes (60 / 12).

Le tableau suivant décrit les attributs de <Rate> :

Attribut Description Présence Par défaut
ref Identifie une variable de flux qui spécifie le débit. Il peut s'agir de n'importe quelle variable de flux, telle qu'un paramètre de requête HTTP, un en-tête, le contenu du corps d'un message ou une valeur telle qu'une KVM. Pour en savoir plus, consultez la documentation de référence sur les variables de flux.

Vous pouvez également utiliser des variables personnalisées à l'aide de la règle JavaScript ou de la règle AssignMessage.

Si vous définissez à la fois ref et le corps de cet élément, la valeur de ref est appliquée et est prioritaire lorsque la variable de flux est définie dans la requête. (L'inverse est vrai lorsque la variable identifiée dans ref n'est pas définie dans la requête.)

Exemple :

<Rate ref="request.header.custom_rate">1pm</Rate>

Dans cet exemple, si le client ne transmet pas un en-tête "custom_rate", le débit du proxy d'API sera d'une requête par minute pour tous les clients. Si le client transmet un en-tête "custom_rate", la limite de débit est de 10 requêtes par seconde pour tous les clients du proxy, jusqu'à ce qu'une requête sans en-tête "custom_rate" soit envoyée.

Vous pouvez utiliser <Identifier> pour regrouper les requêtes afin d'appliquer des débits personnalisés selon le type de client.

Si vous spécifiez une valeur pour ref, mais que vous ne définissez pas le débit dans le corps de l'élément <Rate> et que le client ne transmet pas de valeur, la règle SpikeArrest génère une erreur.

Facultatif n/a

<UseEffectiveCount>

Distribue vos mesures de Spike Arrest entre les processeurs de messages (MP) lorsque vous utilisez des groupes d'autoscaling.

Syntaxe

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

Exemple 1

L'exemple suivant définit <UseEffectiveCount> sur "true" :

<SpikeArrest name='Spike-Arrest-1'>
  <Rate>40ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

L'élément <UseEffectiveCount> est facultatif. La valeur par défaut est false lorsque l'élément est omis de votre règle Spike Arrest.

Valeur par défaut Faux
Obligatoire ? Facultatif
Type Booléen
Élément parent <SpikeArrest>
Éléments enfants Aucun

Le tableau suivant décrit les attributs de l'élément <UseEffectiveCount> :

Attribut Description Par défaut Présence
ref Identifie la variable contenant la valeur de <UseEffectiveCount>. Il peut s'agir de n'importe quelle variable de flux, telle qu'un paramètre de requête HTTP, un en-tête ou le contenu du corps du message. Pour en savoir plus, consultez la documentation de référence sur les variables de flux. Vous pouvez également définir des variables personnalisées à l'aide de la règle JavaScript ou de la règle AssignMessage. n/a Facultatif

L'effet de <UseEffectiveCount> dépend de sa valeur:

  • true: la limite de taux de pic d'un MP correspond à <Rate> divisé par le nombre actuel de MP dans le même pod. La limite globale est la valeur de <Rate>. Lorsque des MP sont ajoutés (ou supprimés) de manière dynamique, leurs limites de taux de pic individuels augmentent (ou diminuent), mais la limite globale reste la même.
  • false (valeur par défaut si elle est omise): la limite de taux de pic de chaque MP correspond simplement à la valeur de son <Rate>. La limite globale correspond à la somme des tarifs de tous les MP. Lorsque des MP sont ajoutés (ou supprimés), leurs limites individuelles de taux de pic restent les mêmes, mais la limite globale augmente (ou diminue).

Le tableau suivant indique l'impact de <UseEffectiveCount> sur la limite de débit effective de chaque MP:

Valeur de <UseEffectiveCount>
false false false true true true
Nombre de points de surveillance 8 4 2 8 4 2
Valeur de <Rate> 10 10 10 40 1 40
Taux effectif par MP 10 10 10 5 10 20
Limite globale 80 40 20 40* 40* 40*
* Identique à <Rate>.

Dans cet exemple, notez que lorsque le nombre de députés passe de 4 à 2 et que <UseEffectiveCount> est false, le tarif effectif par député reste le même (à 10). Toutefois, lorsque <UseEffectiveCount> est true, le taux effectif par député passe de 10 à 20 lorsque le nombre de députés passe de 4 à 2.

Variables de flux

Lorsqu'une règle SpikeArrest est exécutée, la variable de flux suivante est renseignée :

Variable Type Autorisation Description
ratelimit.policy_name.failed Booléen En lecture seule Indique si la règle a échoué (true ou false).

Pour en savoir plus, consultez la documentation de référence sur les variables de flux.

Informations de référence sur les erreurs

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
policies.ratelimit.FailedToResolveSpikeArrestRate 500 This error occurs if the reference to the variable containing the rate setting within the <Rate> element cannot be resolved to a value within the Spike Arrest policy. This element is mandatory and used to specify the spike arrest rate in the form of intpm or intps.
policies.ratelimit.InvalidMessageWeight 500 This error occurs if the value specified for the <MessageWeight> element through a flow variable is invalid (a non-integer value).
policies.ratelimit.SpikeArrestViolation 429

The rate limit was exceeded.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause Fix
InvalidAllowedRate If the spike arrest rate specified in the <Rate> element of the Spike Arrest Policy is not an integer or if the rate does not have ps or pm as a suffix, then the deployment of the API proxy fails.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "SpikeArrestViolation"
ratelimit.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. ratelimit.SA-SpikeArrestPolicy.failed = true

Example error response

Shown below is an example error response:

{  
   "fault":{  
      "detail":{  
         "errorcode":"policies.ratelimit.SpikeArrestViolation"
      },
      "faultstring":"Spike arrest violation. Allowed rate : 10ps"
   }
}

Example fault rule

Shown below is an example fault rule to handle a SpikeArrestViolation fault:

<FaultRules>
    <FaultRule name="Spike Arrest Errors">
        <Step>
            <Name>JavaScript-1</Name>
            <Condition>(fault.name Matches "SpikeArrestViolation") </Condition>
        </Step>
        <Condition>ratelimit.Spike-Arrest-1.failed=true</Condition>
    </FaultRule>
</FaultRules>

Le code d'état HTTP actuel pour le dépassement d'une limite de débit définie par une règle Quota ou Spike Arrest est 429 (trop de requêtes). Pour remplacer le code d'état HTTP par 500 (erreur interne du serveur), définissez la propriété features.isHTTPStatusTooManyRequestEnabled sur false à l'aide de l'API Update organization properties (Mettre à jour les propriétés de l'organisation).

Exemple :

curl -u email:password -X POST -H "Content-type:application/xml" http://api.enterprise.apigee.com/v1/organizations/myorg -d \
"<Organization type="trial" name="MyOrganization">
    <Properties>
        <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property>
        . . .
    </Properties>
</Organization>"

Schémas

Chaque type de règle est défini par un schéma XML (.xsd). Pour référence, des schémas de règles sont disponibles sur GitHub.

Articles associés