Limitar os pedidos de API

Concluído

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