Limitação de solicitação avançada com o Gerenciamento de API do Azure

APLICA-SE A: todas as camadas do Gerenciamento de API

Ser capaz de limitar as solicitações de entrada é fundamental para o Gerenciamento de API do Azure. Ao controlar a taxa de solicitações ou as solicitações/dados totais transferidos, o Gerenciamento de API permite que os provedores de API protejam suas APIs contra o abuso e criem valor para diferentes níveis de produto de API.

Limites de taxa e cotas

Os limites de taxa e as cotas são usados para fins diferentes.

Limites de taxa

Os limites de taxa geralmente são usados para proteger contra intermitências de volume curtos e intensos. Por exemplo, se você souber que seu serviço de back-end tem um gargalo em seu banco de dados com um alto volume de chamadas, você pode definir uma política rate-limit-by-key para não permitir que altos volumes de chamadas usem essa configuração.

Cuidado

Devido à natureza distribuída da arquitetura de limitação, a limitação de taxa nunca é completamente precisa. A diferença entre o número configurado e o número real de solicitações permitidas varia de acordo com o volume e a taxa de solicitação, a latência de back-end e outros fatores.

Cotas

As cotas geralmente são usadas para controlar as taxas de chamada em um período maior. Por exemplo, eles podem definir o número total de chamadas que um determinado assinante pode fazer dentro de um determinado mês. Para monetizar sua API, as cotas também podem ser definidas de forma diferente para assinaturas baseadas níveis. Por exemplo, uma assinatura de nível básico pode não ser capaz de fazer mais de 10.000 chamadas por mês, mas uma de nível Premium pode ir até 100 milhões chamadas por mês.

No Gerenciamento de API do Azure, os limites de taxa normalmente são propagados mais rapidamente entre os nós para proteção contra picos. Por outro lado, as informações de cota de uso são usadas em um prazo maior e, portanto, a implementação é diferente.

Observação

Quando os recursos de computação subjacentes são reiniciados na plataforma de serviço, o Gerenciamento de API pode continuar lidando com solicitações por um curto período depois que uma cota é atingida.

Limitação com base no produto

Os recursos de limitação de taxa que têm o escopo de uma determinada assinatura são úteis para o provedor de API aplicar limites aos desenvolvedores que se inscreveram para usar sua API. No entanto, não ajudam, por exemplo, na limitação de usuários finais individuais da API. É possível que um único usuário do aplicativo do desenvolvedor consuma toda a cota, impedindo que outros clientes do desenvolvedor possam usar o aplicativo. Além disso, vários clientes que gerem um grande volume de solicitações podem limitar o acesso a usuários ocasionais.

Limitação baseada em chave personalizada

Observação

As políticas rate-limit-by-key e quota-by-key não estão disponíveis no nível de consumo do Gerenciamento de API do Azure. A política quota-by-key também não está disponível atualmente nas camadas v2.

As políticas rate-limit-by-key e quota-by-key fornecem uma solução mais flexível para o controle de tráfego. Essas políticas permitem que você defina expressões a fim de identificar as chaves que são usadas para acompanhar o tráfego. O modo como isso funciona será ilustrado com mais facilidade usando um exemplo.

Limitação de endereço de IP

As políticas a seguir restringem um endereço IP de cliente individual para apenas 10 chamadas a cada minuto, com um total de 1.000.000 chamadas e 10.000 quilobytes de largura de banda por mês.

<rate-limit-by-key  calls="10"
          renewal-period="60"
          counter-key="@(context.Request.IpAddress)" />

<quota-by-key calls="1000000"
          bandwidth="10000"
          renewal-period="2629800"
          counter-key="@(context.Request.IpAddress)" />

Se todos os clientes na Internet usassem um endereço IP exclusivo, essa poderia ser uma maneira eficaz de limitar o uso por usuário. No entanto, é bastante provável que vários usuários compartilhem um único endereço IP público, já que acessam a Internet por meio de um dispositivo NAT. Apesar disso, para as APIs que permitem o acesso não autenticado, o IpAddress pode ser a melhor opção.

Limitação de identidade do usuário

Se um usuário final for autenticado, uma chave de limitação poderá ser gerada com base nas informações que identificam esse usuário exclusivamente.

<rate-limit-by-key calls="10"
    renewal-period="60"
    counter-key="@(context.Request.Headers.GetValueOrDefault("Authorization","").AsJwt()?.Subject)" />

Este exemplo mostra como extrair o cabeçalho Autorização, o convertemos no objeto JWT e usamos o assunto do token para identificar o usuário e como a chave de limitação de taxa. Se a identidade do usuário for armazenada no JWT como uma das outras declarações, esse valor poderá ser usado em seu lugar.

Políticas combinadas

Embora as políticas de limitação baseadas no usuário forneçam mais controle do que as políticas de limitação com base na assinatura, ainda vale a pena combinar os dois recursos. Limitar por chave de assinatura do produto (Limitar a taxa de chamada por assinatura e Definir a cota de uso por assinatura) é uma ótima maneira de habilitar a monetização de uma API por meio da cobrança com base nos níveis de uso. O controle mais preciso proporcionado pela limitação de acordo com o usuário é complementar e impede que o comportamento de um usuário afete a experiência de outros.

Limitação controlada pelo cliente

Quando a chave de limitação é definida usando uma expressão de política, é o provedor de API que está escolhendo como a limitação é delimitada. No entanto, um desenvolvedor pode querer controlar como vai limitar seus próprios clientes. Isso pode ser habilitado pelo provedor da API introduzindo um cabeçalho personalizado para permitir que o aplicativo cliente do desenvolvedor comunique a chave para a API.

<rate-limit-by-key calls="100"
          renewal-period="60"
          counter-key="@(request.Headers.GetValueOrDefault("Rate-Key",""))"/>

Isso permite que o aplicativo cliente do desenvolvedor escolha como quer criar a chave de limitação de taxa. Os desenvolvedores do cliente podem criar suas próprias camadas de taxas, alocando conjuntos de chaves a usuários e promovendo a rotatividade do uso da chave.

Resumo

O Gerenciamento de API do Azure fornece limitação de taxa e de cota para proteger e agregar valor ao serviço de sua API. As novas políticas de limitação com regras de escopo personalizadas permitem um controle mais preciso sobre essas políticas para permitir que seus clientes criem aplicativos ainda melhores. Os exemplos deste artigo demonstram o uso dessas novas políticas criando chaves de limitação de taxa com endereços IP do cliente, identidade do usuário e valores gerados pelo cliente. No entanto, há muitas outras partes da mensagem que podem ser usadas como agente do usuário, fragmentos de caminho de URL, tamanho da mensagem.

Próximas etapas

Envie-nos seus comentários como problema do GitHub para este tópico. Seria ótimo conhecer outros possíveis valores de chave que foram uma escolha lógica para os seus cenários.