golang.org/x/time/rate
Den Rate Limiter verwenden
golang.org/x/time/rate ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Das rate-Paket
golang.org/x/time/rate stellt einen produktionsreifen Token-Bucket-Limiter bereit. Es ist die Standardwahl für Rate Limiting in Go.
- In der Praxis bewährte Implementierung
- Allow-, Wait- und Reserve-Methoden
- Kontextbewusst
Einen Limiter erstellen
rate.NewLimiter nimmt eine Rate (Tokens pro Sekunde) und eine Burst-Größe entgegen. rate.Limit ist ein float64-Wert für Ereignisse pro Sekunde.
limiter := rate.NewLimiter(rate.Limit(10), 5)rate.Every
Wenn Sie eher in Intervallen als in Raten pro Sekunde denken, wandelt rate.Every eine Dauer in eine Rate um. Ein Ereignis alle 200 ms entspricht fünf Ereignissen pro Sekunde.
limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)Allow
Allow gibt an, ob gerade ein Token verfügbar ist. Die Methode gibt true zurück und verbraucht ein Token oder gibt sofort false zurück. Verwenden Sie sie, um überzählige Anfragen abzulehnen.
if !limiter.Allow() {
fmt.Println("rejected: too many requests")
return
}Wait
Wait blockiert, bis ein Token verfügbar ist oder der Kontext abgebrochen wird. Die Methode eignet sich ideal, wenn Sie die Arbeit takten möchten, anstatt sie zu verwerfen.
if err := limiter.Wait(ctx); err != nil {
return err
}
doWork()Reserve
Reserve gibt eine Reservation zurück, die angibt, wie lange gewartet werden muss. Rufen Sie Delay() auf, um die Wartezeit zu ermitteln, und Cancel(), wenn Sie doch nicht fortfahren möchten.
r := limiter.Reserve()
if !r.OK() {
return
}
time.Sleep(r.Delay())Hinweis: Externes Paket
Das rate-Paket gehört nicht zur Standardbibliothek und erfordert daher go get golang.org/x/time/rate sowie ein Modul. Snippets, die es importieren, dienen zur Veranschaulichung und werden hier nicht inline ausgeführt.
Ein ausführbares Pendant aus der Standardbibliothek
Da das rate-Paket extern ist, folgt hier eine Taktungsschleife aus der Standardbibliothek, die Wait durch einen Tick alle 200 ms nachahmt.
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)
}
}Zur Laufzeit anpassen
Sie können Limits mit SetLimit und SetBurst im laufenden Betrieb ändern. Das ist nützlich, wenn ein Neuladen der Konfiguration oder eine vorgelagerte 429-Antwort Ihnen signalisiert, dass Sie die Geschwindigkeit reduzieren müssen.
limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)Rate-Limiter pro Client
Führen Sie eine Map vom Client-Schlüssel zu *rate.Limiter, geschützt durch einen Mutex. Erstellen Sie beim ersten Request für diesen Schlüssel einen Limiter und verwenden Sie ihn bei nachfolgenden Requests wieder.
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
Umschließen Sie die Handler so, dass jeder Request zuerst Allow() aufruft. Wenn false zurückgegeben wird, antworten Sie mit HTTP 429 Too Many Requests. Dies ist das kanonische serverseitige Rate-Limit.
Kurztest
Testen Sie Ihr Wissen über das Rate-Paket.
Zusammenfassung
Sie haben golang.org/x/time/rate kennengelernt:
- NewLimiter(rate, burst) erstellt den Bucket
- rate.Every wandelt ein Intervall in eine Rate um
- Allow lehnt ab, Wait taktet, Reserve meldet die Verzögerung
- SetLimit und SetBurst passen die Werte zur Laufzeit an
- Map pro Client plus HTTP 429 für Server
Lerne Go mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „golang.org/x/time/rate“ kostenlos?
Ja — der vollständige Text von „golang.org/x/time/rate“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „golang.org/x/time/rate“?
Den Rate Limiter verwenden Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „golang.org/x/time/rate“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das Token-Bucket-Konzept
- golang.org/x/time/rate
- Goroutines drosseln
- Backoff und Wiederholung