golang.org/x/time/rate
Use o limitador de taxa
golang.org/x/time/rate é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
O pacote rate
golang.org/x/time/rate fornece um Limiter de balde de tokens pronto para produção. É a escolha padrão para limitar taxas em Go.
- Implementação amplamente testada
- Métodos Allow, Wait e Reserve
- Compatível com contextos
Criando um Limiter
rate.NewLimiter recebe uma taxa (tokens por segundo) e um tamanho de rajada. rate.Limit é um float64 de eventos por segundo.
limiter := rate.NewLimiter(rate.Limit(10), 5)rate.Every
Se você pensa em intervalos em vez de taxas por segundo, rate.Every converte uma duração em uma taxa. Um evento a cada 200 ms equivale a cinco por segundo.
limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)Allow
Allow informa se há um token disponível neste momento. Retorna true e consome um token ou retorna false imediatamente. Use-o para rejeitar solicitações excedentes.
if !limiter.Allow() {
fmt.Println("rejected: too many requests")
return
}Wait
Wait bloqueia até que um token esteja disponível ou o contexto seja cancelado. É ideal quando você quer espaçar o trabalho em vez de descartá-lo.
if err := limiter.Wait(ctx); err != nil {
return err
}
doWork()Reserve
Reserve retorna uma Reservation que descreve quanto tempo esperar. Chame Delay() para saber o tempo de espera e Cancel() se decidir não prosseguir.
r := limiter.Reserve()
if !r.OK() {
return
}
time.Sleep(r.Delay())Observação: pacote externo
O pacote rate não faz parte da biblioteca padrão, portanto requer go get golang.org/x/time/rate e um módulo. Os trechos que o importam são ilustrativos e não são executados diretamente aqui.
Um análogo executável da biblioteca padrão
Como o pacote rate é externo, veja aqui um loop de espaçamento da biblioteca padrão que imita Wait emitindo sinais a cada 200 ms.
package main
import (
"fmt"
"time"
)
func main() {
tick := time.NewTicker(200 * time.Millisecond)
defer tick.Stop()
for i := 0; i < 4; i++ {
<-tick.C
fmt.Println("processed event", i)
}
}Ajustando em tempo de execução
Você pode alterar os limites dinamicamente com SetLimit e SetBurst. Isso é útil quando uma recarga de configuração ou uma resposta 429 do serviço upstream informa que você deve diminuir o ritmo.
limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)Limitadores por cliente
Mantenha um mapa da chave do cliente para *rate.Limiter, protegido por um mutex. Crie um limitador na primeira solicitação para essa chave e reutilize-o nas solicitações subsequentes.
func getLimiter(m map[string]*rate.Limiter, key string) *rate.Limiter {
if l, ok := m[key]; ok {
return l
}
l := rate.NewLimiter(rate.Limit(5), 10)
m[key] = l
return l
}Camada intermediária HTTP
Envolva os manipuladores para que cada solicitação chame Allow() primeiro. Quando o resultado for falso, responda com HTTP 429 Muitas solicitações. Essa é a limitação de taxa padrão no lado do servidor.
Verificação rápida
Teste seus conhecimentos sobre o pacote de limitação de taxa.
Recapitulação
Você aprendeu sobre golang.org/x/time/rate:
- NewLimiter(rate, burst) cria o balde
- rate.Every converte um intervalo em uma taxa
- Allow rejeita, Wait controla o ritmo e Reserve informa o atraso
- SetLimit e SetBurst ajustam os parâmetros durante a execução
- Mapa por cliente e HTTP 429 para servidores
Perguntas Frequentes
A aula “golang.org/x/time/rate” é grátis?
Sim — o texto completo de “golang.org/x/time/rate” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “golang.org/x/time/rate”?
Use o limitador de taxa Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “golang.org/x/time/rate”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Conceito do balde de tokens
- golang.org/x/time/rate
- Limitação de goroutines
- Recuo e nova tentativa