Rate Limiting in Go: Leitfaden zur Begrenzung der Anfragenrate

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Rate Limiting in Go: Vollständiger Leitfaden zur Begrenzung der Anfragenrate

\n\n

Rate Limiting (Begrenzung der Anfragenrate) ist ein entscheidender Mechanismus zum Schutz und zur Laststeuerung in modernen Webanwendungen und Microservices. In der Sprache Go (Golang) gibt es viele Ansätze und Bibliotheken zur Implementierung von Rate Limiting, von einfachen bis hin zu fortgeschrittenen. In diesem Artikel behandeln wir die grundlegenden Konzepte, beliebte Bibliotheken und zeigen Codebeispiele.

\n\n

Was ist Rate Limiting und warum wird es benötigt?

\n\n

Rate Limiting ist eine Technik zur Kontrolle der Anzahl von Anfragen, die ein Client in einem bestimmten Zeitraum senden kann. Die Hauptziele sind:

\n\n
    \n
  • Schutz vor DDoS-Angriffen — Verhinderung einer Serverüberlastung
  • \n
  • Faire Ressourcenverteilung — gleicher Zugang für alle Benutzer
  • \n
  • Ressourcenschonung — Senkung der Infrastrukturkosten
  • \n
  • Verhinderung von Missbrauch — Schutz vor Scraping und Brute-Force
  • \n
\n\n

Wichtige Algorithmen für Rate Limiting

\n\n

Es gibt mehrere klassische Algorithmen, jeder mit seinen eigenen Vorteilen:

\n\n
    \n
  • Token Bucket (Token-Eimer) — der beliebteste Algorithmus, bei dem "Token" mit einer bestimmten Rate angesammelt werden
  • \n
  • Leaky Bucket (Leaky Bucket) — Anfragen werden mit einer festen Rate verarbeitet, Überschuss wird verworfen
  • \n
  • Fixed Window (Festes Fenster) — einfacher Zähler für Anfragen in einem festen Zeitintervall
  • \n
  • Sliding Window (Gleitendes Fenster) — genauer als Fixed Window, berücksichtigt zeitliche Grenzen
  • \n
\n\n

Beliebte Bibliotheken für Rate Limiting in Go

\n\n

1. Standardbibliothek: golang.org/x/time/rate

\n\n

Dies ist die offizielle Erweiterung des Go-Teams, die den Token-Bucket-Algorithmus implementiert. Sie ist leichtgewichtig, einfach zu bedienen und ideal für die meisten Szenarien.

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n    "time"\n    "golang.org/x/time/rate"\n)\n\nfunc main() {\n    // Erstellen eines Limiters: 2 Anfragen pro Sekunde, mit Burst 5\n    limiter := rate.NewLimiter(2, 5)\n\n    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n        if !limiter.Allow() {\n            http.Error(w, "Zu viele Anfragen", http.StatusTooManyRequests)\n            return\n        }\n        fmt.Fprintf(w, "OK: %s", time.Now().Format(time.RFC3339))\n    })\n\n    http.ListenAndServe(":8080", nil)\n}
\n\n

2. github.com/ulule/limiter

\n\n

Eine flexiblere Bibliothek mit Unterstützung für verschiedene Speicher (Redis, Memcached, In-Memory) und Algorithmen. Geeignet für verteilte Systeme.

\n\n
import (\n    "github.com/gin-gonic/gin"\n    "github.com/ulule/limiter/v3"\n    "github.com/ulule/limiter/v3/drivers/store/memory"\n)\n\nfunc main() {\n    // Konfiguration: 10 Anfragen pro Sekunde\n    rate := limiter.Rate{\n        Period: 1 * time.Second,\n        Limit:  10,\n    }\n\n    store := memory.NewStore()\n    instance := limiter.New(store, rate)\n\n    r := gin.Default()\n    r.Use(func(c *gin.Context) {\n        key := c.ClientIP()\n        context, err := instance.Get(c.Request.Context(), key)\n        if err != nil {\n            c.AbortWithStatusJSON(500, gin.H{"error": "Interner Fehler"})\n            return\n        }\n        if context.Reached {\n            c.AbortWithStatusJSON(429, gin.H{"error": "Zu viele Anfragen"})\n            return\n        }\n        c.Next()\n    })\n\n    r.Run(":8080")\n}
\n\n

3. github.com/juju/ratelimit

\n\n

Eine einfache und zuverlässige Bibliothek von Canonical, basierend auf dem Token-Bucket-Algorithmus. Zeichnet sich durch eine minimalistische API aus.

\n\n
import (\n    "github.com/juju/ratelimit"\n    "time"\n)\n\nfunc main() {\n    // Erstellen eines Buckets: 100 Token, Auffüllung 10 Token pro Sekunde\n    bucket :=                    

Empfehlungen