Política de SpikeArrest

Estás viendo la documentación de Apigee Edge.
Ir a la documentación de Apigee X.
info

Ícono de Spike Arrest de la IU de Edge

La política de Spike Arrest protege contra aumentos repentinos de tráfico con el elemento <Rate>. Este elemento regula la cantidad de solicitudes que procesa un proxy de API y se envía a un backend, lo que protege contra los retrasos de rendimiento y el tiempo de inactividad.

Elemento <SpikeArrest>

Define la política de Spike Arrest

Valor predeterminado Consulta la pestaña Política predeterminada, a continuación
¿Es obligatorio? Opcional
Tipo Objeto complejo
Elemento principal No disponible
Elementos secundarios <Identifier>
<MessageWeight>
<Rate> (obligatorio)
<UseEffectiveCount>

Sintaxis

El elemento <SpikeArrest> usa la siguiente sintaxis:

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

Política predeterminada

En el siguiente ejemplo, se muestra la configuración predeterminada cuando agregas una política de Spike Arrest a tu flujo en la IU de 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>

Este elemento tiene los siguientes atributos que son comunes a todas las políticas:

Atributo Predeterminada (obligatorio) Descripción
name N/A Obligatorio

El nombre interno de la política. El valor del atributo name puede contener letras, números, espacios, guiones, guiones bajos y puntos. Este valor no puede superar los 255 caracteres.

De forma opcional, usa el elemento <DisplayName> para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.

continueOnError falso Opcional Si la estableces como "false", muestra un error cuando falla una política. Este es el comportamiento previsto para la mayoría de las políticas. Si su valor es "true", la ejecución del flujo continuará incluso después de que falle la política.
enabled true Opcional Si estableces la política como "true", la aplicarás. Si la estableces como "false", se desactivará la política. La política no se aplicará, incluso si permanece conectada a un flujo.
async   falso Funciones obsoletas Este atributo dejó de estar disponible.

Ejemplos

En los siguientes ejemplos, se muestran algunas de las formas en las que puedes usar la política de Spike Arrest:

Ejemplo 1

En el siguiente ejemplo, se establece la frecuencia en cinco por segundo:

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

La política suaviza la tasa a una solicitud permitida cada 200 milisegundos (1,000/5).

Ejemplo 2

En el siguiente ejemplo, se establece la frecuencia en 300 por minuto:

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

La tasa efectiva es de 300 PM, lo que significa que se agrega un token nuevo al bucket cada 200 milisegundos. El tamaño del bucket siempre se configura como el 10% de messagesPerPeriod. Por lo tanto, con un messagesPerPeriod de 300, el tamaño del bucket es de 30 tokens.

Ejemplo 3

En el siguiente ejemplo, se restringen las solicitudes a 12 por minuto (una solicitud permitida cada cinco segundos o 60/12):

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

Además, el elemento <MessageWeight> acepta un valor personalizado (el encabezado weight) que ajusta el peso del mensaje para apps o clientes específicos. Esto proporciona un control adicional sobre el límite para las entidades que se identifican con el elemento <Identifier>.

Ejemplo 4

El siguiente ejemplo le indica a Spike Arrest que busque un valor de entorno de ejecución configurado a través de la solicitud que se pasa como la variable de flujo request.header.runtime_rate:

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

El valor de la variable de flujo debe tener el formato intpm o intps.

Para probar este ejemplo, ejecuta una solicitud como la siguiente:

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

Referencia del elemento secundario

En esta sección, se describen los elementos secundarios de <SpikeArrest>.

<DisplayName>

Se usan además del atributo name para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.

El elemento <DisplayName> es común a todas las políticas.

Valor predeterminado n/a
¿Es obligatorio? Opcional. Si omites <DisplayName>, se usa el valor del atributo name de la política.
Tipo String
Elemento principal <PolicyElement>
Elementos secundarios Ninguno

El elemento <DisplayName> usa la siguiente sintaxis:

Sintaxis

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

Ejemplo

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

El elemento <DisplayName> no tiene atributos ni elementos secundarios.

<Identifier>

Te permite elegir cómo agrupar las solicitudes para que se pueda aplicar la política de Spike Arrest según el cliente. Por ejemplo, puedes agrupar solicitudes por ID de desarrollador, en cuyo caso las solicitudes de cada desarrollador se contarán en su propia frecuencia de Spike Arrest y no todas las solicitudes al proxy.

Instala junto con el elemento <MessageWeight> para obtener un control más preciso sobre la regulación de solicitudes.

Si dejas el elemento <Identifier> vacío, se aplica un límite de frecuencia para todas las solicitudes a ese proxy de API.

Valor predeterminado n/a
¿Es obligatorio? Opcional
Tipo String
Elemento principal <SpikeArrest>
Elementos secundarios Ninguno

Sintaxis

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

Ejemplo 1

En el siguiente ejemplo, se aplica la política Spike Arrest por ID de desarrollador:

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

En la siguiente tabla, se describen los atributos de <Identifier>:

Atributo Descripción Predeterminado Presencia
ref Identifica la variable según la cual Spike Arrest agrupa las solicitudes entrantes. Puedes usar cualquier variable de flujo para indicar un cliente único, como los disponibles con la política VerifyAPIKey. También puedes usar variables personalizadas mediante la política de JavaScript o la Política de AssignMessage. n/a Obligatorio

Este elemento también se analiza en la siguiente publicación de la comunidad de Apigee: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.

<MessageWeight>

Especifica la ponderación definida para cada mensaje. El peso de los mensajes modifica el impacto de una solicitud única en el cálculo de la tasa de Spike Arrest. El peso del mensaje puede ser cualquier variable de flujo, como un encabezado HTTP, un parámetro de consulta, un parámetro de formulario o contenido del cuerpo del mensaje. También puedes usar variables personalizadas mediante la política de JavaScript o la Política de AssignMessage.

Usa junto con <Identifier> para limitar aún más las solicitudes de clientes o apps específicos.

Por ejemplo, si el SpikeArrest <Rate> es 10pm y una app envía solicitudes con una ponderación de 2, solo se permiten cinco mensajes por minuto, porque cada solicitud cuenta como 2.

Valor predeterminado n/a
¿Es obligatorio? Opcional
Tipo Entero
Elemento principal <SpikeArrest>
Elementos secundarios Ninguno

Sintaxis

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

Ejemplo 1

En el siguiente ejemplo, se restringen las solicitudes a 12 por minuto (una solicitud permitida cada cinco segundos o 60/12):

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

En este ejemplo, <MessageWeight> acepta un valor personalizado (el encabezado weight en la solicitud) que ajusta la ponderación de los mensajes para clientes específicos. Esto proporciona un control adicional sobre el límite para las entidades que se identifican con el elemento <Identifier>.

En la siguiente tabla, se describen los atributos de <MessageWeight>:

Atributo Description Presencia Predeterminado
ref Identifica la variable de flujo que contiene la ponderación del mensaje para el cliente específico. Puede ser cualquier variable de flujo, como un parámetro de búsqueda HTTP, un encabezado o contenido del cuerpo del mensaje. Para obtener más información, consulta Referencia de variables de flujo. También puedes usar variables personalizadas mediante la política de JavaScript o la Política de AssignMessage. Obligatorio N/A

<Rate>

Especifica la frecuencia a la que se deben limitar los aumentos repentinos de tráfico (o aumentos de actividad) mediante la configuración de la cantidad de solicitudes permitidas en intervalos por minuto o por segundo. También puedes usar este elemento junto con <Identifier> y <MessageWeight> a fin de limitar el tráfico en el entorno de ejecución con facilidad. Para ello, debes aceptar valores del cliente.

Valor predeterminado n/a
¿Es obligatorio? Obligatorio
Tipo Entero
Elemento principal <SpikeArrest>
Elementos secundarios Ninguno

Sintaxis

Puedes especificar tasas de una de las siguientes maneras:

  • Una tasa estática que especificas como cuerpo del elemento <Rate>
  • Un valor variable, que el cliente puede pasar. Identificar el nombre de la variable de flujo con el atributo ref.
<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
</SpikeArrest>

Los valores de las tarifas válidas (definidas como valores de variables o en el cuerpo del elemento) deben cumplir con el siguiente formato:

  • intps (cantidad de solicitudes por segundo, se suman en intervalos de milisegundos)
  • intpm (cantidad de solicitudes por minuto, se suman en intervalos de segundos)

El valor de int debe ser un número entero positivo que no sea cero.

Ejemplo 1

En el ejemplo siguiente, se establece la frecuencia en cinco solicitudes por segundo:

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

La política suaviza la tasa a una solicitud permitida cada 200 milisegundos (1,000/5).

Ejemplo 2

En el siguiente ejemplo, se establece la frecuencia a 12 solicitudes por minuto:

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

Esta política de ejemplo mitiga la frecuencia a una solicitud permitida cada cinco segundos (60/12).

En la siguiente tabla, se describen los atributos de <Rate>:

Atributo Description Presencia Predeterminado
ref Identifica una variable de flujo que especifica la frecuencia. Puede ser cualquier variable de flujo, como un parámetro de búsqueda HTTP, un encabezado o contenido del cuerpo del mensaje, o un valor, como una KVM. Para obtener más información, consulta Referencia de variables de flujo.

También puedes usar variables personalizadas mediante la política de JavaScript o la Política de AssignMessage.

Si defines ref y el cuerpo de este elemento, se aplicará el valor de ref y tendrá prioridad cuando la variable de flujo se establezca en la solicitud. (La inversa es verdadera cuando la variable identificada en ref no se establece en la solicitud).

Por ejemplo:

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

En este ejemplo, si el cliente no pasa un encabezado "custom_rate", la frecuencia del proxy de API es de 1 solicitud por minuto para todos los clientes. Si el cliente pasa un encabezado "custom_rate", el límite de frecuencia se convierte en 10 solicitudes por segundo para todos los clientes del proxy, hasta que se envía una solicitud sin el encabezado "custom_rate".

Puedes usar <Identifier> para agrupar solicitudes y aplicar tarifas personalizadas para diferentes tipos de clientes.

Si especificas un valor para ref, pero no estableces la velocidad en el cuerpo del elemento <Rate> y el cliente no pasa un valor, la política de Spike Arrest muestra un error.

Opcional N/A

<UseEffectiveCount>

Distribuye los recuentos de Spike Arrest entre los procesadores de mensajes (MPs) cuando se usan grupos de ajuste de escala automático.

Sintaxis

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

Ejemplo 1

En el siguiente ejemplo, se establece <UseEffectiveCount> en verdadero:

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

El elemento <UseEffectiveCount> es opcional. El valor predeterminado es false cuando el elemento se omite en tu política de Spike Arrest.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <SpikeArrest>
Elementos secundarios Ninguno

En la siguiente tabla, se describen los atributos del elemento <UseEffectiveCount>:

Atributo Descripción Predeterminado Presencia
ref Identifica la variable que contiene el valor de <UseEffectiveCount>. Puede ser cualquier variable de flujo, como un parámetro de búsqueda HTTP, un encabezado o contenido del cuerpo del mensaje. Para obtener más información, consulta Referencia de variables de flujo. También puedes usar variables personalizadas mediante la política de JavaScript o la Política de AssignMessage. n/a Opcional

El efecto de <UseEffectiveCount> depende de su valor:

  • true: El límite de frecuencia de picos de un MP es el resultado de dividir <Rate> por la cantidad actual de MPs en el mismo pod. El límite agregado es el valor de <Rate>. Cuando se agregan (o quitan) MPs de forma dinámica, sus límites de frecuencia individuales aumentan (o disminuyen), pero el límite agregado permanece igual.
  • false: El límite de frecuencia de picos de cada MP es simplemente el valor de su <Rate>. El límite agregado es la suma de las tarifas de todas las MP. Cuando se agregan (o quitan) MPs, sus límites individuales de tasa de picos se mantienen, pero el límite agregado aumenta (o disminuye).

La política de SpikeArrest usa un algoritmo de "bucket de tokens" que disminuye los aumentos de tráfico dividiendo el límite de frecuencia que especifiques en intervalos más pequeños. Una desventaja de este enfoque es que posiblemente se denieguen varias solicitudes legítimas que ingresen en un intervalo de tiempo corto.

Por ejemplo, supongamos que ingresa una frecuencia de 30 pm (30 solicitudes por minuto). En las pruebas, podrías pensar que podrías enviar 30 solicitudes en 1 segundo, siempre que estén dentro de un minuto. Pero esa no es la forma en que la política aplica la configuración. Si lo piensas, 30 solicitudes en un período de 1 segundo se podrían considerar un pequeño aumento en algunos entornos.

  • Las tarifas por minuto se suman a las solicitudes completas permitidas en intervalos de segundos.

    Por ejemplo, 30 pm se mitigan de la siguiente manera:
    60 segundos (1 minuto) / 30 pm = intervalos de 2 segundos o 1 solicitud permitida cada 2 segundos. Una segunda solicitud dentro de 2 segundos fallará. Además, fallará la solicitud 31 en un minuto.

  • Las tarifas por segundo se suman a las solicitudes completas permitidas en intervalos de milisegundos.

    Por ejemplo, 10 ps se suavizan de la siguiente manera:
    1,000 milisegundos (1 segundo) / 10 ms = 100 milisegundos o 1 solicitud permitida cada 100 milisegundos. Una segunda solicitud dentro de los 100 ms fallarán. Además, fallará la solicitud 11 en un segundo error.

En la siguiente tabla, se muestra el efecto de <UseEffectiveCount> en el límite de frecuencia efectivo de cada MP:

Valor de <UseEffectiveCount>
false false false true true true
Cantidad de MPs 8 4 2 8 4 2
Valor de <Rate> 10 10 10 40 40 40
Tasa efectiva por MP 10 10 10 5 10 20
Límite agregado 80 40 20 40* 40* 40*
* Igual que <Rate>.

En este ejemplo, observa que, cuando la cantidad de MPs se reduce de 4 a 2 y <UseEffectiveCount> es false, la tasa efectiva por MP se mantiene igual (en 10). Sin embargo, cuando <UseEffectiveCount> es true, la tasa efectiva por MP pasa de 10 a 20 cuando la cantidad de MP se reduce de 4 a 2.

Variables de flujo

Cuando se ejecuta una política de Spike Arrest, se propaga la siguiente variable de flujo:

Variable Tipo Permiso Descripción
ratelimit.policy_name.failed Booleano Solo lectura Indica si la política falló o no (true o false).

Para obtener más información, consulta Referencia de variables de flujo.

Referencia de errores

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>

El código de estado HTTP actual para superar un límite de frecuencia establecido por una política de cuota o Spike Arrest es 429 (demasiadas solicitudes). Para cambiar el código de estado HTTP a 500 (error interno del servidor), configura la propiedad features.isHTTPStatusTooManyRequestEnabled como false con la API de Actualizar propiedades de la organización.

Por ejemplo:

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>"

Esquemas

Un esquema XML (.xsd) define cada tipo de política. Como referencia, los esquemas de políticas están disponibles en GitHub.

Temas relacionados