Esta documentação tem como objetivo explicar o funcionamento do rate limiter na aplicação de Estoque.
O que é rate limiter?
Rate limiter, também conhecido como limitador de taxa, é um mecanismo utilizado para controlar a taxa de solicitações ou acessos a um serviço, aplicação ou API (Interface de Programação de Aplicativos). Ele impõe limites no número de requisições que podem ser feitas durante um determinado período de tempo, com o objetivo de evitar sobrecarga ou abuso do sistema.
O rate limiter é usado para proteger servidores e recursos de serem excessivamente utilizados, garantindo que as solicitações sejam distribuídas de forma justa entre os usuários e aplicativos. Ele ajuda a evitar que um único usuário ou aplicativo monopolize os recursos, causando degradação de desempenho ou até mesmo a indisponibilidade do sistema para outros usuários.
Geralmente, o rate limiter é implementado através de um conjunto de regras que determinam a taxa máxima permitida de requisições por segundo, minuto ou outro intervalo de tempo. Quando o limite é atingido, as solicitações excedentes podem ser rejeitadas, adiadas ou colocadas em uma fila para processamento posterior, dependendo da política de limitação definida.
O rate limiter é uma técnica importante para garantir a estabilidade e a segurança de sistemas, evitando excesso de utilização e promovendo um uso justo dos recursos disponíveis.
Path aplicado o rate-limiter:
- Atualização de estoque
- Criação de estoque
- Consulta de estoque
A configuração do rate limiter aplicada no Inventory foi utilizando o método "fixed window" (janela fixa) que envolve a definição de um limite máximo de requisições durante um determinado intervalo de tempo fixo. Nesse método, o intervalo de tempo é dividido em janelas fixas e as requisições são contabilizadas dentro de cada janela.
Cada janela tem um intervalo de 1 minuto e uma limitação DEFAULT de 5000 requisições por cliente. Os identificadores únicos (ID) de cada cliente são armazenados no Redis (cache) para controlar a quantidade de requisições por janela.
Configurações que são a níveis de aplicação (Globais) e que são customizaveis através de variaveis de ambient. Alguns exemplos de configurações que podem ser definidas dessa forma incluem:
RATE_LIMITER_INTERVAL (Intervalo de janelas)
'1 second'
⇒ Janela em intervalo de tempo em Segundos.
**'1 minute'**
⇒ Janela em intervalo de tempo em Minutos.
'1 Hour'
⇒ Janela em intervalo de tempo em Horas.
'1 day'
⇒ Janela em intervalo de tempo em Dias.
RATE_LIMITER_POLICY (Tipo de política das Janelas)
'token_bucket'
⇒ Determina a capacidade máxima do Bucket, ou seja, o número máximo de tokens que podem ser armazenados nele. Por exemplo, você pode definir uma taxa de 100 tokens por segundo.
'**fixed_window**'
⇒ Cada janela é tratada de forma independente, ou seja, as requisições são contabilizadas apenas dentro de cada janela individual.
'sliding_window'
⇒ Um intervalo de tempo contínuo é utilizado, sem divisão em janelas fixas.
'no_limit'
⇒ Como o próprio nome já sugere é uma janela que não há limite para requisições.
RATE_LIMITER_MAX
'5000'
⇒ Determina a capacidade máxima de requisições por Janela.
As configurações padrão (DEFAULT) destacadas na cor verde nos exemplos acima foram definidas com base na observação e análise do comportamento da aplicação em ambiente produtivo. No entanto, é importante destacar que é totalmente possível e recomendado ajustar individualmente os limites por cliente, adaptando-os de acordo com suas necessidades específicas. Dessa forma, esse ajuste poderá ser configurado pelo time de P&D após uma análise que justifique qualquer alteração.
Exemplo:
O que acontece se o limite de requisições for excedido?
Quando o limite de requisições é excedido, o rate limiter irá rejeitar as requisições excedentes até que a janela de 1 minuto expire. Essa tratativa será sinalizado com um código de erro e uma mensagem indicando que o limite foi atingido.
Por exemplo:
/** CODE RESPONSE 429 **/
{
"error": "Rate limit exceeded"
}
HTTP 429 - "Rate limit exceeded" para indicar o excesso de requisições.
Será possível realizar novas requisições assim que a janela de 1 minuto do rate limiter for renovada. Isso significa que, quando a próxima janela de 1 minuto começar, o contador de requisições será reiniciado e o cliente poderá fazer novas requisições dentro dos limites permitidos configurado.