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:

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.