Go Academy · Lektion

golang.org/x/time/rate

Den Rate Limiter verwenden

Lektion 2 von 413 Schritte

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
Kostenlos starten

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

  1. Das Token-Bucket-Konzept
  2. golang.org/x/time/rate
  3. Goroutines drosseln
  4. Backoff und Wiederholung
← Zurück zu Go Academy