Limitar solicitações à API
É comum descobrir que alguns usuários utilizam uma API em excesso. Às vezes, uma API é superutilizada a tal ponto que você incorre em custos extras ou que a capacidade de resposta para outros usuários é reduzida. Você pode usar a limitação (limitação de taxa) para ajudar a proteger os pontos de extremidade da API, restringindo o número de vezes que uma API pode ser chamada dentro de um período especificado.
A API de Censo, por exemplo, é distribuída para muitas agências governamentais, portanto, o número de chamadas para a API pode se tornar significativo. Aplicando uma política de limite de taxa, podemos habilitar uma resposta rápida a todas as solicitações, de modo que não é possível um só cliente usar todos os recursos da API de Censo.
Nesta unidade, você aprende a usar as políticas do Gerenciamento de API para impor dois tipos de limitação.
Limite por limitação de assinatura
A limitação de assinatura permite que você defina limites de taxa segundo uma operação específica da API. Ela não diferencia de acordo com o cliente. Em vez disso, cada solicitação à API ou à operação especificada é limitada da mesma maneira. Usando nosso exemplo da API de censo, poderíamos usar a limitação de assinatura para limitar o número de vezes que qualquer uma das APIs é chamada em um determinado período. Essa configuração faria com que os clientes recebessem um erro 429 quando esse limite fosse atingido. O problema com esse tipo de limitação é que ele permite que um cliente use todas as solicitações antes que outro cliente possa usá-las.
Por exemplo, o código a seguir demonstra uma configuração de exemplo que se aplica a todas as operações da API. O limite é definido como três chamadas por período de 15 segundos:
<rate-limit calls="3" renewal-period="15" />
Como alternativa, essa configuração pode ser usada para direcionar uma operação específica da API:
<rate-limit calls="number" renewal-period="seconds">
<api name="API name" id="API id" calls="number" renewal-period="seconds" />
<operation name="operation name" id="operation id" calls="number" renewal-period="seconds" />
</api>
</rate-limit>
Limitar por limitação de chave
A limitação de chave permite configurar diferentes limites de taxa de acordo com qualquer valor de solicitação do cliente. Esse tipo de limitação proporciona um jeito melhor de gerenciar os limites de taxa, pois aplica o limite a uma chave de solicitação especificada, geralmente o endereço IP do cliente. Isso fornece a cada cliente uma largura de banda igual para chamar a API:
<rate-limit-by-key calls="number"
renewal-period="seconds"
increment-condition="condition"
counter-key="key value" />
A seguinte configuração de exemplo restringe o limite de taxa pelo endereço IP de uma solicitação. Aqui, o limite é definido como 10 chamadas por período de 60 segundos:
<rate-limit-by-key calls="10"
renewal-period="60"
increment-condition="@(context.Response.StatusCode == 200)"
counter-key="@(context.Request.IpAddress)"/>
Ao optar pela limitação por chave, você precisa decidir os requisitos específicos para a limitação da taxa. Por exemplo, a seguinte tabela lista três maneiras comuns de especificar a chave do contador:
Valor | Descrição |
---|---|
context.Request.IpAddress | Taxas limitadas pelo endereço IP do cliente |
context.Subscription.Id | Taxas limitadas pela ID da assinatura |
context.Request.Headers.GetValue("My-Custom-Header-Value") | Taxas limitadas por um valor de cabeçalho de solicitação do cliente especificado |
Você pode decidir que deseja que cada IP de cliente individual tenha a própria largura de banda definida. Nesse caso, você usaria context.Request.IpAddress. Como alternativa, você poderia querer que todas as solicitações de um determinado nome de domínio fossem limitadas, pois determinados domínios têm muitas chamadas à API. Nesse caso, você especificaria context.Request.Headers.GetValue("host"), que limitaria a taxa segundo os domínios dos quais a chamada foi feita.
Observação
A política <rate-limit-by-key>
não estará disponível quando seu gateway de Gerenciamento de API estiver na camada de Consumo. Você pode usar <rate-limit>
em vez dela.