golang.org/x/time/rate
Brug rate-limiteren
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
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
- Token-bucket-konceptet
- golang.org/x/time/rate
- Throttling af goroutines
- Backoff og genforsøg