Política de Detenção de pico

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

Ícone de controle de pico na interface do Edge

A política de Detenção de pico protege contra o aumento do tráfego com o elemento <Rate>. Esse elemento limita o número de solicitações processadas por um proxy de API e enviadas para um back-end, protegendo contra atrasos de desempenho e inatividade.

Elemento <SpikeArrest>

Define a política de Detenção de pico.

Valor padrão Consulte a guia Política padrão a seguir
Obrigatório? Opcional
Tipo Objeto complexo
Elemento pai N/A
Elementos filhos <Identifier>
<MessageWeight>
<Rate> (obrigatório)
<UseEffectiveCount>

Sintaxe

O elemento <SpikeArrest> usa a seguinte sintaxe:

<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 padrão

O exemplo a seguir mostra as configurações padrão quando você adiciona uma política de controle de pico ao fluxo na IU do 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>

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

Exemplos

Os exemplos a seguir mostram algumas maneiras de usar a política de retenção de pico:

Exemplo 1

O exemplo a seguir define a taxa como cinco por segundo:

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

A política simplifica a taxa para uma solicitação permitida a cada 200 milissegundos (1000/5).

Exemplo 2

O exemplo a seguir define a taxa para 12 por minuto:

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
</SpikeArrest>

Essa política de exemplo simplifica a taxa para uma solicitação permitida a cada cinco segundos (60/12).

Exemplo 3

O exemplo a seguir restringe solicitações a 12 por minuto (uma solicitação permitida a cada cinco segundos ou 60/12):

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

Além disso, o elemento <MessageWeight> aceita um valor personalizado (o cabeçalho weight) que ajusta os pesos das mensagens para apps ou clientes específicos. Isso proporciona controle adicional sobre a limitação de entidades identificadas com o elemento <Identifier>.

Exemplo 4

O exemplo a seguir instrui a Detenção de pico a procurar um valor de ambiente de execução definido por meio da solicitação que é transmitida como a variável de fluxo request.header.runtime_rate:

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

O valor da variável de fluxo precisa estar no formato intpm ou intps.

Para testar este exemplo, execute uma solicitação como esta:

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

Referência a elementos filhos

Esta seção descreve os elementos filhos de <SpikeArrest>.

<DisplayName>

Use in addition to the name attribute to label the policy in the management UI proxy editor with a different, more natural-sounding name.

The <DisplayName> element is common to all policies.

Default Value n/a
Required? Optional. If you omit <DisplayName>, the value of the policy's name attribute is used
Type String
Parent Element <PolicyElement>
Child Elements None

The <DisplayName> element uses the following syntax:

Syntax

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

Example

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

The <DisplayName> element has no attributes or child elements.

<Identifier>

Permite escolher como agrupar as solicitações, para que a política Detenção de pico possa ser aplicada com base no cliente. Por exemplo, é possível agrupar solicitações por ID de desenvolvedor. Nesse caso, as solicitações de cada desenvolvedor serão consideradas na própria taxa de Detenção de pico e não todas as solicitações para o proxy.

Use em conjunto com o elemento <MessageWeight> para um controle mais refinado sobre a limitação de solicitações.

Se você deixar o elemento <Identifier> vazio, um limite de taxa será aplicado a todas as solicitações nesse proxy de API.

Valor padrão N/A
Obrigatório? Opcional
Tipo String
Elemento pai <SpikeArrest>
Elemento filho Nenhum

Sintaxe

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

Exemplo 1

O exemplo a seguir aplica a política de Detenção de pico por ID de desenvolvedor:

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

A tabela a seguir descreve os atributos de <Identifier>:

Atributo Descrição Padrão Presença
ref Identifica a variável pela qual a Detenção de pico agrupa as solicitações recebidas. É possível usar qualquer variável de fluxo para indicar um cliente único, como aqueles disponíveis na política VerifyAPIKey. Também é possível definir variáveis personalizadas usando a política JavaScript ou a política AssignMessage. N/A Obrigatório

Esse elemento também é discutido na seguinte postagem da comunidade Apigee: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.

<MessageWeight>

Especifica a ponderação definida para cada mensagem. O peso da mensagem modifica o impacto de uma única solicitação no cálculo da taxa de Detenção de pico. O peso da mensagem pode ser qualquer variável de fluxo, como cabeçalho HTTP, parâmetro de consulta, parâmetro do formulário ou conteúdo do corpo da mensagem. Também é possível usar variáveis personalizadas com a política JavaScript ou a política AssignMessage.

Use com <Identifier> para acelerar ainda mais as solicitações de clientes ou aplicativos específicos.

Por exemplo, se a Detenção de pico <Rate> for 10pm, e um aplicativo enviar solicitações com um peso de 2, somente cinco mensagens por minuto serão permitidas desse cliente, porque cada solicitação conta como 2.

Valor padrão N/A
Obrigatório? Opcional
Tipo Número inteiro
Elemento pai <SpikeArrest>
Elemento filho Nenhum

Sintaxe

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

Exemplo 1

O exemplo a seguir restringe solicitações a 12 por minuto (uma solicitação permitida a cada cinco segundos ou 60/12):

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

Neste exemplo, <MessageWeight> aceita um valor personalizado (o cabeçalho weight na solicitação) que ajusta os pesos das mensagens para clientes específicos. Isso proporciona controle adicional sobre a limitação de entidades identificadas com o elemento <Identifier>.

A tabela a seguir descreve os atributos de <MessageWeight>:

Atributo Descrição Presença Padrão
ref Identifica a variável de fluxo que contém o peso da mensagem para o cliente específico. Pode ser qualquer variável de fluxo, como um parâmetro de consulta HTTP, cabeçalho ou conteúdo do corpo da mensagem. Para mais informações, consulte a Referência de variáveis de fluxo. Também é possível definir variáveis personalizadas usando a política JavaScript ou a política AssignMessage. Obrigatório N/A

<Rate>

Especifica a taxa para limitar os picos de tráfego (ou bursts) definindo o número de solicitações permitidas em intervalos de minutos ou segundos. Também é possível usar esse elemento com <Identifier> e <MessageWeight> para limitar facilmente o tráfego no ambiente de execução aceitando valores do cliente.

Valor padrão N/A
Obrigatório? Obrigatório
Tipo Número inteiro
Elemento pai <SpikeArrest>
Elemento filho Nenhum

Sintaxe

É possível especificar taxas de uma das seguintes maneiras:

  • Uma taxa estática que você especifica como o corpo do elemento <Rate>
  • Um valor variável, que pode ser transmitido pelo cliente; identifica o nome da variável de fluxo usando o atributo ref
<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
</SpikeArrest>

Os valores de taxa válidos (definidos como um valor variável ou no corpo do elemento) precisam estar em conformidade com o seguinte formato:

  • intps (número de solicitações por segundo, simplificadas em intervalos de milissegundos)
  • intpm (número de solicitações por minuto, simplificadas em intervalos de segundos)

O valor de int precisa ser um número inteiro positivo diferente de zero.

Exemplo 1

O exemplo a seguir define a taxa para cinco solicitações por segundo:

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

A política simplifica a taxa para uma solicitação permitida a cada 200 milissegundos (1000/5).

Exemplo 2

No exemplo a seguir, a taxa é definida para 12 solicitações por minuto:

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
</SpikeArrest>

Essa política de exemplo simplifica a taxa para uma solicitação permitida a cada cinco segundos (60/12).

A tabela a seguir descreve os atributos de <Rate>:

Atributo Descrição Presença Padrão
ref Identifica uma variável de fluxo que especifica a taxa. Ele pode ser qualquer variável de fluxo, como um parâmetro de consulta HTTP, cabeçalho ou conteúdo do corpo da mensagem, ou um valor como um KVM. Para mais informações, consulte a Referência de variáveis de fluxo.

Também é possível usar variáveis personalizadas usando a política JavaScript ou a política AssignMessage.

Se você definir ref e o corpo desse elemento, o valor de ref será aplicado e terá precedência quando a variável de fluxo for definida na solicitação. O inverso é verdadeiro quando a variável identificada em ref não é definida na solicitação.

Exemplo:

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

Neste exemplo, se o cliente não transmitir um cabeçalho "custom_rate", a taxa do proxy de API será 1 solicitação por minuto para todos os clientes. Se o cliente transmitir um cabeçalho "custom_rate", o limite de taxa se tornará 10 solicitações por segundo para todos os clientes no proxy, até que uma solicitação sem o cabeçalho "custom_rate" seja enviada.

Use <Identifier> para agrupar solicitações que impõem taxas personalizadas a diferentes tipos de cliente.

Se você especificar um valor para ref, mas não definir a taxa no corpo do elemento <Rate> e o cliente não transmitir um valor, a política de Detenção de pico gerará um erro.

Opcional N/A

<UseEffectiveCount>

Distribui suas contagens de controle de pico entre os processadores de mensagens (MPs, na sigla em inglês) ao usar grupos de escalonamento automático.

Sintaxe

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

Exemplo 1

O exemplo a seguir define <UseEffectiveCount> como verdadeiro:

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

O elemento <UseEffectiveCount> é opcional. O valor padrão é false quando o elemento é omitido da política de controle de pico.

Valor padrão Falso
Obrigatório? Opcional
Tipo Booleano
Elemento pai <SpikeArrest>
Elemento filho Nenhum

A tabela a seguir descreve os atributos do elemento <UseEffectiveCount>:

Atributo Descrição Padrão Presença
ref Identifica a variável que contém o valor de <UseEffectiveCount>. Pode ser qualquer variável de fluxo, como um parâmetro de consulta HTTP, cabeçalho ou conteúdo do corpo da mensagem. Para mais informações, consulte a Referência de variáveis de fluxo. Também é possível definir variáveis personalizadas usando a política JavaScript ou a política AssignMessage. N/A Opcional

O efeito de <UseEffectiveCount> depende do valor:

  • true: o limite de taxa de pico de um MP é o <Rate> dividido pelo número atual de MPs no mesmo pod. O limite agregado é o valor de <Rate>. Quando os MPs são adicionados (ou removidos) dinamicamente, os limites individuais de taxa de pico aumentam (ou diminuem), mas o limite agregado permanece o mesmo.
  • false (esse será o valor padrão, se omitido): o limite de taxa de pico de cada MP é simplesmente o valor de <Rate>. O limite agregado é a soma das taxas de todos os MPs. Quando os MPs são adicionados (ou removidos), os limites de taxa de pico individuais deles permanecem os mesmos, mas o limite agregado aumenta (ou diminui).

A tabela a seguir mostra o efeito de <UseEffectiveCount> no limite de taxa efetiva de cada MP:

Valor de <UseEffectiveCount>
false false false true true true
No de MPs 8 4 2 8 4 2
Valor de <Rate> 10 10 10 40 40 40
Taxa efetiva por MP 10 10 10 5 10 20
Limite agregado 80 40 20 40* 40* 40*
* Igual a <Rate>.

Neste exemplo, observe que, quando o número de MPs é reduzido de 4 para 2 e <UseEffectiveCount> é false, a taxa efetiva por MP permanece a mesma (a 10). Mas quando <UseEffectiveCount> é true, a taxa efetiva por MP vai de 10 para 20 quando o número de MPs é reduzido de 4 para 2.

Variáveis de fluxo

Quando uma política de Detenção de pico é executada, a variável de fluxo a seguir é preenchida:

Variável Tipo Permissão Descrição
ratelimit.policy_name.failed Booleano Somente leitura Indica se a política falhou (true ou false).

Para mais informações, consulte a Referência de variáveis de fluxo.

Referência de erros

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>

O código de status HTTP atual para exceder um limite de taxa definido por uma política de limitação de cota ou pico é 429 (muitas solicitações). Para mudar o código de status HTTP para 500 (erro interno do servidor), defina a propriedade features.isHTTPStatusTooManyRequestEnabled como false usando a API Atualizar propriedades da organização.

Exemplo:

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

Cada tipo de política é definido por um esquema XML (.xsd). Para referência, os esquemas de política estão disponíveis no GitHub.

Temas relacionados