0Pricing
Go Academy · Aula

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

  1. Conceito do balde de tokens
  2. golang.org/x/time/rate
  3. Limitação de goroutines
  4. Recuo e nova tentativa
← Voltar para Go Academy