Go Academy · Lektion

golang.org/x/time/rate

Brug rate-limiteren

Lektion 2 af 413 trin

golang.org/x/time/rate er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.

rate-pakken

golang.org/x/time/rate leverer en token bucket-implementering med Limiter, der er klar til produktion. Det er standardvalget til hastighedsbegrænsning i Go.

  • Gennemprøvet implementering
  • Metoderne Allow, Wait og Reserve
  • Understøtter kontekst

Oprettelse af en Limiter

rate.NewLimiter tager en hastighed (tokens pr. sekund) og en størrelse for spidsbelastningen. rate.Limit er en float64, der angiver hændelser pr. sekund.

limiter := rate.NewLimiter(rate.Limit(10), 5)

rate.Every

Hvis du tænker i intervaller i stedet for hastigheder pr. sekund, konverterer rate.Every en varighed til en hastighed. Én hændelse hvert 200. ms svarer til fem pr. sekund.

limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)

Allow

Allow angiver, om en token er tilgængelig lige nu. Den returnerer true og bruger en token eller returnerer straks false. Brug den til at afvise overskydende forespørgsler.

if !limiter.Allow() {
    fmt.Println("rejected: too many requests")
    return
}

Wait

Wait blokerer, indtil en token er tilgængelig, eller konteksten annulleres. Den er ideel, når du vil fordele arbejdet over tid i stedet for at kassere det.

if err := limiter.Wait(ctx); err != nil {
    return err
}
doWork()

Reserve

Reserve returnerer en Reservation, der beskriver, hvor længe du skal vente. Kald Delay() for at se ventetiden, og Cancel(), hvis du beslutter ikke at fortsætte.

r := limiter.Reserve()
if !r.OK() {
    return
}
time.Sleep(r.Delay())

Bemærk: Ekstern pakke

rate-pakken er ikke en del af standardbiblioteket, så den kræver go get golang.org/x/time/rate og et modul. Kodestumper, der importerer den, er illustrative og køres ikke direkte her.

En kørbar analog med standardbiblioteket

Da rate-pakken er ekstern, får du her en tidsstyringsløkke fra standardbiblioteket, der efterligner Wait ved at udløse et interval hvert 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)
    }
}

Justering under kørsel

Du kan ændre grænserne under kørsel med SetLimit og SetBurst. Det er praktisk, når en konfigurationsgenindlæsning eller et svar med statuskoden 429 fra en overordnet tjeneste fortæller dig, at hastigheden skal sænkes.

limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)

Hastighedsbegrænsere pr. klient

Bevar et map fra klientnøgle til *rate.Limiter, beskyttet af en mutex. Opret en begrænser ved den første forespørgsel med den pågældende nøgle, og genbrug den derefter.

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
}

HTTP-middleware

Pak håndtererne ind, så hver forespørgsel først kalder Allow(). Hvis resultatet er false, skal du svare med HTTP 429 For mange forespørgsler. Dette er den kanoniske hastighedsbegrænsning på serversiden.

Hurtigt tjek

Afprøv din viden om ratepakken.

Opsummering

Du har lært om golang.org/x/time/rate:

  • NewLimiter(rate, burst) opretter token-spanden
  • rate.Every omdanner et interval til en hastighed
  • Allow afviser, Wait regulerer tempoet, og Reserve angiver forsinkelsen
  • SetLimit og SetBurst justerer under kørsel
  • Et map pr. klient kombineret med HTTP 429 til servere
Gratis at komme i gang

Lær Go med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “golang.org/x/time/rate” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “golang.org/x/time/rate”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “golang.org/x/time/rate”?

Brug rate-limiteren Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Go Academy?

Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “golang.org/x/time/rate”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Go Academy-lektion?

Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Token-bucket-konceptet
  2. golang.org/x/time/rate
  3. Throttling af goroutines
  4. Backoff og genforsøg
← Tilbage til Go Academy