DEV Community

rodrigopizzi
rodrigopizzi

Posted on

Token Bucket

O que é token bucket?

Token bucket é um algoritmo para controlar a quantidade de transmissões de modo que não ultrapasse uma determinada capacidade.

No contexto de aplicações esse algoritmo ajuda a limitar a carga que a aplicação vai receber, evitando qualquer tipo de abuso de requisições.

Como ele funciona?

A quantidade máxima de tokens que podemos usar é determina pelo seu bucket. Um bucket é como se fosse um balde cheio de fichas (tokens). Cada requisição pode consumir uma ou mais fichas, dependendo da regra de controle do fluxo. Todo bucket possui uma taxa de reposição de tokens, ou seja, a cada "x" tempo, ou quando algo acontece, o token é devolvido ao bucket permitindo assim novas requisições.

Para entender melhor vamos usar o Pix do banco central como exemplo. Veja a tabela a seguir como o bacen descreveu suas regras de token bucket:

Limitação de requisições PIX

A regra para criar uma chave pix possui limitações. O bucket tem tamanho de 36k de tokens. Isso significa que é possivel fazer uso de 36k de requests para criar chaves pix. Se algum dia acontecer uma rajada de requisições o máximo possivel será de 36k e a partir dai o bucket ficará vazio, forçando a aguardar até que a taxa de reposição aconteça. Neste caso a cada minuto serão repostos 1200 tokens. Esse limite é compartilhado nas funcionalidades de criar e deletar chaves.

Alem disso é possivel realizar combinações da taxa de reposição com regras de negocio de sua aplicação. Por exemplo o banco central consome mais de um token quando uma chave pix é lida e não é utilizada em seguida em algum pagamento. Isso evita abuso do consumo desse recurso pois se isso acontece o bucket fica vazio rapidamente e não é mais possivel utilizar esse recurso.

Da pra imanigar muitas formas diferentes de evitar sobrecarga e abuso da API que esta sendo protegida por este método.

Legal, como implemento isso na minha aplicação?

É possivel implementar o algoritmo token bucket do zero. Mas isso pode dar trabalho e desprender muito esforço. Uma boa opção é utilizar a biblioteca bucket4j.

O bucket4j possui a implementação do token bucket e pode ajudar muito nesse sentido.

Referências

Top comments (0)