Rate Limiting in Go: Vollständiger Leitfaden zur Begrenzung der Anfragenrate
\n\nRate 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\nWas ist Rate Limiting und warum wird es benötigt?
\n\nRate 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
Wichtige Algorithmen für Rate Limiting
\n\nEs 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
Beliebte Bibliotheken für Rate Limiting in Go
\n\n1. Standardbibliothek: golang.org/x/time/rate
\n\nDies 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\npackage 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\n2. github.com/ulule/limiter
\n\nEine flexiblere Bibliothek mit Unterstützung für verschiedene Speicher (Redis, Memcached, In-Memory) und Algorithmen. Geeignet für verteilte Systeme.
\n\nimport (\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\n3. github.com/juju/ratelimit
\n\nEine einfache und zuverlässige Bibliothek von Canonical, basierend auf dem Token-Bucket-Algorithmus. Zeichnet sich durch eine minimalistische API aus.
\n\nimport (\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 := Auch in der Bibliothek
Go Validator: Vollständige Anleitung mit Beispielen
ORM für C++: Vergleich und Beispiele zur Nutzung von Bibliotheken
Aufgabenwarteschlangen in Go (Golang): Die besten Bibliotheken und Werkzeuge
HTML-Parsing in Go: Überblick über Bibliotheken und Codebeispiele