Limitar os pedidos de API
É comum descobrir que alguns usuários usam demais uma API. Às vezes, uma API é usada em excesso a tal ponto que você incorre em custos extras ou que a capacidade de resposta a 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 várias agências governamentais, pelo que o número de chamadas à API pode ser elevado. Ao aplicar uma política de limite de taxa, podemos permitir uma resposta rápida a todas as solicitações para que não seja possível que um único cliente use todos os recursos para a API do Censo.
Nesta unidade, você aprenderá a usar políticas de Gerenciamento de API para impor dois tipos de limitação.
Limitação por subscrição
A limitação por subscrição permite-lhe definir os limites de taxa por uma operação de API específica. Não discrimina o cliente. Em vez disso, todos os pedidos à API ou à operação especificada são limitados da mesma forma. Usando nosso exemplo de API do Census, poderíamos usar a limitação de assinatura para limitar o número de vezes que qualquer uma das APIs é chamada dentro de um determinado período. Esta configuração faria com que fosse apresentado um erro 429 aos clientes, quando o limite fosse atingido. O problema deste tipo de limitação é que permite que um cliente utilize todos os pedidos antes que outro cliente possa utilizar a subscrição.
Por exemplo, o código a seguir demonstra uma configuração de exemplo que se aplica a todas as operações de API. O limite é fixado em três chamadas por cada período de 15 segundos:
<rate-limit calls="3" renewal-period="15" />
Em alternativa, esta configuração pode ser utilizada para visar uma determinada operação de 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>
Limitação por chave
A limitação por chave permite-lhe configurar limites de taxa diferentes por qualquer valor de pedido de cliente. Esse tipo de limitação oferece uma maneira 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. Ele dá a cada cliente largura de banda igual para chamar a API:
<rate-limit-by-key calls="number"
renewal-period="seconds"
increment-condition="condition"
counter-key="key value" />
O exemplo de configuração a seguir limita o limite de taxa pelo endereço IP de uma solicitação. Aqui, o limite é definido para 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)"/>
Quando você escolhe acelerar por chave, você precisa decidir sobre os requisitos específicos para limitação de taxa. Por exemplo, a tabela a seguir lista três maneiras comuns de especificar a chave de conta:
valor | Description |
---|---|
context.Request.IpAddress | Taxas limitadas pelo endereço IP do cliente |
context.Subscription.Id | Taxas limitadas pelo ID da subscrição |
context.Request.Headers.GetValue("My-Custom-Header-Value") | Taxas limitadas pelo valor do cabeçalho de um pedido do cliente especificado |
Pode decidir se pretende que cada IP de cliente individual tenha uma definição de largura de banda particular. Nesse caso, teria de utilizar o context.Request.IpAddress. Em alternativa, pode pretender que todos os pedidos de um nome de domínio específico sejam limitados, pois alguns domínios fazem muitas chamadas à API. Nesse caso, você especificaria o contexto. Request.Headers.GetValue("host") que classificaria o limite pelos domínios a partir dos quais a chamada foi feita.
Nota
A <rate-limit-by-key>
política não estará disponível quando o gateway de Gerenciamento de API estiver na camada Consumo. Em alternativa, pode utilizar a política <rate-limit>
.