Règle SpikeArrest

Cette page s'applique à Apigee et à Apigee hybrid.

Consultez la documentation d' Apigee Edge.

Icône SpikeArrest de l'interface utilisateur

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.

Cette règle est une règle standard qui peut être déployée sur n'importe quel type d'environnement. Pour en savoir plus sur les types de règles et la disponibilité avec chaque type d'environnement, consultez la section Types de règles.

Différence entre SpikeArrest et Quota

La règle de quota configure le nombre de messages de requête qu'une application cliente est autorisée à envoyer à une API pendant une heure, un jour, une semaine ou un mois. La règle de quota applique des limites de consommation aux applications clientes en alimentant un compteur distribué du nombre de requêtes entrantes.

Utilisez le quota pour appliquer des contrats d'entreprise ou des contrats de niveau de service vis-à-vis de développeurs et de partenaires, plutôt que pour la gestion du trafic opérationnel. Utilisez SpikeArrest comme protection contre les pics soudains du trafic de l'API. Consultez également la section Comparer les règles de quota et de pics.

Vidéos

Ces vidéos présentent les cas d'utilisation de cette règle :

Utilité

Comparer les règles de quotas

É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 SpikeArrest à votre flux dans l'interface utilisateur :

<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>false</UseEffectiveCount>
</SpikeArrest>

This element has the following attributes that are common to all policies:

Attribute Default Required? Description
name N/A Required

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

continueOnError false Optional Set to false to return an error when a policy fails. This is expected behavior for most policies. Set to true to have flow execution continue even after a policy fails. See also:
enabled true Optional Set to true to enforce the policy. Set to false to turn off the policy. The policy will not be enforced even if it remains attached to a flow.
async   false Deprecated This attribute is deprecated.

Exemples

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

Exemple 1

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

<SpikeArrest name="SA-Static-5ps">
  <Rate>5ps</Rate>
  <UseEffectiveCount>false</UseEffectiveCount>
</SpikeArrest>

Cet exemple de règle autorise un maximum de 5 requêtes par seconde. Par lissage, il est appliqué avec un maximum d'une requête pour chaque intervalle de 200 millisecondes (1 000/5).

Exemple 2

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

<SpikeArrest name="SA-Static-12pm">
  <Rate>12pm</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

Cet exemple de règle autorise un maximum de 12 requêtes par minute à raison d'une requête toutes les cinq secondes (60/12). S'il y a plusieurs requêtes dans l'intervalle de 5 secondes, ces requêtes sont autorisées (aucun lissage) à condition que le nombre de requêtes soit inférieur à la limite de débit configurée de 12 par minute.

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).

De plus, l'élément <MessageWeight> accepte une valeur personnalisée (la variable request_specific_weight) qui ajuste la pondération des messages pour des requêtes spécifiques. Cela permet de mieux contrôler la limitation du débit pour les entités identifiées avec l'élément <Identifier>.

<SpikeArrest name="SA-With-Dynamic-Weight-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request_specific_weight" />
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

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="SA-From-Inbound-Header-1">
  <Rate ref="request.header.runtime_rate" />
  <UseEffectiveCount>true</UseEffectiveCount>
</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 https://my-api-endpoint.net/price -H 'runtime_rate:30ps'

Normalement, vous n'autorisez pas l'application appelante à définir la limite de fréquence. Vous devez plutôt déduire la limite de fréquence d'une valeur définie en tant qu'attribut personnalisé sur un produit d'API ou sur l'application cliente.

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
Obligatoire ? 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 d'un élément de la requête entrante. Par exemple, vous pouvez appliquer des limites de débit par ID de développeur, auquel cas toutes les requêtes envoyées par les applications appartenant à un développeur particulier partageront un seul nombre SpikeArrest. Vous pouvez également appliquer une limite de fréquence par ID client. Dans ce cas, chaque application cliente sera soumise à un compteur de limite de fréquence distinct. Vous pouvez également faire référence à une variable que votre proxy a définie précédemment. Cette variable peut combiner plusieurs facteurs, par exemple l'ID client et l'adresse IP du client.

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/>
  <UseEffectiveCount>true</UseEffectiveCount>
</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

Ce problème est également abordé dans ce post destiné à la communauté Apigee.

<MessageWeight>

Indique la pondération définie pour le message actuel. La pondération des messages modifie l'impact d'une requête unique sur le calcul du taux SpikeArrest. 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. Toutefois, vous n'utiliserez normalement pas de variable directement dérivée de la requête entrante. Vous devez utiliser une variable qui représente un attribut personnalisé sur un produit d'API ou sur l'application cliente. Vous pouvez également utiliser des variables personnalisées définies avec des valeurs dynamiques à l'aide de la règle JavaScript ou de la règle AssignMessage. Dans tous les cas, la valeur doit être un entier positif non nul.

Utilisez le poids 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 que le proxy utilise une variable qui contient la valeur 2 pour la pondération du message, seuls cinq messages par minute seront autorisés pour l'identifiant donné, 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>

Pondération variable

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="SA-With-Dynamic-Weight-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request_specific_weight" />
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

Dans cet exemple, <MessageWeight> accepte une valeur personnalisée (la variable request_specific_weight, probablement calculée précédemment) qui ajuste les pondérations des messages pour des requêtes spécifiques. Cela permet de mieux contrôler la limitation du débit en fonction de la complexité des requêtes.

Poids statique

L'exemple suivant limite le nombre de requêtes à 1 000 par minute, et chaque requête reçoit un poids de 1 :

<SpikeArrest name="SA-Default-Weight-1">
  <Rate>1000pm</Rate>
  <Identifier ref="client_id" />
  <!-- omit <MessageWeight/> to use a default weight of 1 -->
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

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 utiliser cet élément conjointement avec <Identifier> et <MessageWeight> afin de limiter de manière fluide le trafic au moment de l'exécution avec un contrôle précis. Utilisez l'élément <UseEffectiveCount> pour définir l'algorithme de limitation du débit utilisé par la règle.

Consultez la section SpikeArrest de la page "Limites" pour connaître les limites de débit maximales que vous pouvez spécifier.

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="SA-Static-5ps">
  <Rate>5ps</Rate>
  <UseEffectiveCount>false</UseEffectiveCount>
</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 name="SA-Static-12pm">
  <Rate>12pm</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</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 d'en-tête custom_rate, le taux du proxy d'API est d'une requête par minute pour tous les clients. Si le client transmet un en-tête custom_rate, la limite du débit passe à 10 requêtes par seconde pour tous les clients sur le 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 taux personnalisés à différents types de clients.

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>

Cet élément vous permet de choisir entre des algorithmes SpikeArrest distincts en définissant la valeur sur true ou false, comme expliqué ci-dessous :

vrai

Si la valeur est true, SpikeArrest est distribué dans une région. Cela signifie que le décompte des requêtes est synchronisé entre les processeurs de messages (MP) d'une même région. En outre, un algorithme de limitation du débit "à fenêtre glissante" est utilisé. Cet algorithme fournit un comportement de limitation de débit cohérent et ne "lisse" pas le nombre de requêtes entrantes pouvant être envoyées au backend. Si une rafale de requêtes est envoyée sur une courte période, elles sont autorisées tant qu'elles ne dépassent pas la limitation de débit configurée, telle que définie dans l'élément <Rate>. Exemple :

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

false (valeur par défaut)

Si la valeur est false (valeur par défaut), la règle SpikeArrest utilise un algorithme "token bucket" qui lisse les pics de trafic en divisant la limite de débit que vous définissez en intervalles plus courts. L'inconvénient de cette approche est que plusieurs requêtes légitimes qui arrivent sur une courte période peuvent être refusées.

Par exemple, supposons que vous saisissiez un débit de 30 pm (30 requêtes par minute). Lors des tests, on pourrait imaginer envoyer 30 requêtes en une seconde, à condition qu'elles arrivent dans la minute qui suit. Mais ce n'est pas ainsi que la règle s'applique. À bien y réfléchir, 30 requêtes en une seconde pourraient être considérées comme un mini pic dans certains environnements.

  • Les débits par minute sont lissés pour obtenir un nombre de requêtes complètes autorisées par intervalles exprimés en secondes.

    Par exemple, un taux de 30 pm est lissé de la manière suivante :
    60 secondes (une minute) / 30 = 2 secondes, soit une requête autorisée toutes les deux secondes. Une seconde requête dans un intervalle de deux secondes échouera. Une 31e requête dans un intervalle d'une minute échouera également.

  • Les débits par seconde sont lissés pour obtenir un nombre de requêtes complètes autorisées par intervalles exprimés en millisecondes.

    Par exemple, un débit de 10 ps est lissé comme suit :
    1 000 millisecondes (1 seconde) / 10 ps = 100 millisecondes d'intervalles ou une requête autorisée toutes les 100 millisecondes. Une deuxième requête dans un intervalle de 100 ms échouera. En outre, une 11e requête dans un intervalle d'une seconde échouera.

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

Variables de flux

Lorsqu'une règle SpikeArrest est exécutée, les variables de flux suivantes sont renseignées :

Propriété Type Lecture/Écriture Description Début du champ d'application
ratelimit.policy_name.allowed.count Long En lecture seule Renvoie le décompte de quota autorisé. PostClientFlow
ratelimit.policy_name.used.count Long En lecture seule Renvoie le quota actuel utilisé dans un intervalle de quota. PostClientFlow
ratelimit.policy_name.available.count Long En lecture seule Renvoie le décompte de quota disponible dans l'intervalle de quota. PostClientFlow
ratelimit.policy_name.exceed.count Long En lecture seule Renvoie 1 une fois le quota dépassé PostClientFlow
ratelimit.policy_name.total.exceed.count Long En lecture seule Renvoie 1 une fois le quota dépassé PostClientFlow
ratelimit.policy_name.expiry.time Long En lecture seule

Renvoie le temps UTC (en millisecondes) qui détermine la date d'expiration du quota et le début d'un nouvel intervalle.

Lorsque le type de règle de quotas est rollingwindow, cette valeur n'est pas valide, car l'intervalle de quota n'expire jamais.

PostClientFlow
ratelimit.policy_name.identifier Chaîne En lecture seule Renvoie la référence de l'identifiant (client) associée à la règle. PostClientFlow
ratelimit.policy_name.class Chaîne En lecture seule Renvoie la classe associée à l'identifiant client PostClientFlow
ratelimit.policy_name.class.allowed.count Long En lecture seule Renvoie le nombre de quotas autorisés défini dans la classe PostClientFlow
ratelimit.policy_name.class.used.count Long En lecture seule Renvoie le quota utilisé dans une classe PostClientFlow
ratelimit.policy_name.class.available.count Long En lecture seule Renvoie le nombre de quotas disponibles dans la classe PostClientFlow
ratelimit.policy_name.class.exceed.count Long En lecture seule Renvoie le nombre de requêtes qui dépassent la limite définie dans la classe dans l'intervalle de quota actuel PostClientFlow
ratelimit.policy_name.class.total.exceed.count Long En lecture seule Renvoie le nombre total de requêtes qui dépassent la limite définie pour la classe parmi tous les intervalles de quotas. Il correspond donc à la somme de class.exceed.count pour tous les intervalles de quota PostClientFlow
ratelimit.policy_name.failed Booléen En lecture seule

Indique si la règle a échoué (vrai ou faux)

PostClientFlow

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 Apigee 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 SpikeArrest 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 is 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 SpikeArrest 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).

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