O throttling permite um controle preciso de tráfego para lidar com picos de acesso, sobrecarga de serviço, exaustão de recursos e ataques maliciosos. Esse mecanismo protege a estabilidade dos serviços de backend, reduz custos e melhora a experiência do usuário.
Conceitos de throttling
O throttling limita o número de requisições enviadas a um serviço em um determinado período, como 300 requisições por minuto ou 10 requisições por segundo. Isso evita que um serviço sofra sobrecarga devido ao excesso de requisições vindas de um endereço IP específico ou de clientes globais.
Por exemplo, se você limitar o número de requisições a um serviço para 300 por minuto, a 301ª requisição será negada. Simultaneamente, o sistema retornará o código de status HTTP 429, indicando excesso de requisições.
Modos de throttling
Os proxies Envoy suportam dois modos de throttling: local e global. O throttling local limita a taxa de requisições de cada instância de serviço individualmente. Já o throttling global utiliza um serviço gRPC centralizado para aplicar limites de taxa em toda a instância do Service Mesh (ASM). É possível combinar ambos os modos para aplicar diferentes níveis de controle.
|
Modo |
Descrição |
Referências |
|
Throttling local |
|
|
|
Throttling global ou distribuído |
|
Configure limitação de taxa global para serviços de aplicação |
Funcionamento do throttling local
Um proxy Envoy utiliza o algoritmo de token bucket para implementar o throttling local. Tokens são adicionados a um bucket em uma taxa constante. Cada requisição recebida consome um token. Quando o bucket fica vazio, as requisições subsequentes são negadas. Normalmente, é necessário especificar os seguintes parâmetros:
O intervalo de preenchimento do bucket
A quantidade de tokens adicionados ao bucket em cada intervalo
Por padrão, um proxy Envoy retorna o código de status HTTP 429 quando uma requisição é negada e o cabeçalho x-envoy-ratelimited é definido. Você pode personalizar o código de status HTTP e o cabeçalho de resposta.
Observe os seguintes conceitos ao utilizar o recurso de throttling:
http_filter_enabled: indica a porcentagem de requisições nas quais o limite de taxa local é verificado, mas não aplicado.
http_filter_enforcing: indica a porcentagem de requisições nas quais o limite de taxa local é efetivamente aplicado ou imposto.
Defina os valores como porcentagens. Por exemplo, defina http_filter_enabled para 10% das requisições e http_filter_enforcing para 5%. Dessa forma, você testa o efeito do throttling antes de aplicá-lo a todas as requisições.
Funcionamento do throttling global
O throttling global controla as taxas de requisição em uma instância ASM por meio do serviço de limitação de taxa do Envoy. Esse serviço processa o tráfego centralmente e aplica os limites de taxa com base em regras e cotas predefinidas.
A configuração do throttling global envolve duas partes: o filtro rate_limits do Envoy e a configuração do serviço de limitação de taxa.
O filtro rate_limits contém uma lista de
actions. Um proxy Envoy tenta corresponder cada requisição a cada ação presente nesse filtro. Um descritor é gerado para cada ação. Esse descritor consiste em um conjunto de entradas que correspondem à ação. Cada entrada é um par chave-valor, como"descriptor-key-1": "descriptor-value-1"e"descriptor-key-2": "descriptor-value-2". Para mais informações, consulte config-http-filters-rate-limit.A configuração do serviço de limitação de taxa é comparada com a entrada de descritor gerada para cada requisição. Essa configuração especifica o limite de taxa para um conjunto específico de entradas de descritor. O serviço interage com o cache Redis para determinar se deve limitar as taxas das requisições e envia a decisão de throttling ao proxy Envoy.
Em conjunto, o filtro rate_limits e o serviço de limitação de taxa implementam o throttling global. O filtro gera um descritor com base na ação configurada e o envia ao serviço de limitação de taxa, que determina o limite aplicável e retorna uma resposta de throttling. Esse mecanismo oferece controle total sobre as taxas de requisição e protege os serviços de backend contra picos de tráfego.