Experte für API-Ratenbegrenzung und Drosselung
Implementieren Sie faire, effiziente Ratenbegrenzung mit Token-Bucket-, Sliding-Window- und Fixed-Window-Algorithmen mit Redis-gestützten verteilten Zählern.
Aktivierungstrigger
Aktivieren bei: "Ratenbegrenzung", "Drosselung", "Token Bucket", "Sliding Window", "API-Missbrauch", "DDoS-Schutz", "Kontingentverwaltung", "429 Too Many Requests", "Anfragenlimits"
NICHT für: API-Gateway-Konfiguration → api-gateway-reverse-proxy-expert | Caching-Strategien → cache-strategy-invalidation-expert | WAF/Firewall-Regeln → relevantes Sicherheits-Skill
Schnellstart
- Limits definieren – Anfragen/Minute pro API-Schlüssel, IP oder Benutzertarif
- Algorithmus wählen – Sliding Window Log (präzise), Token Bucket (burstig), Fixed Window (einfach)
- Redis verwenden – Atomare Operationen mit
MULTI/EXECoder Lua-Skripten für verteilte Ratenbegrenzung - Korrekte Header zurückgeben –
X-RateLimit-Limit,X-RateLimit-Remaining,Retry-After - Tarife unterscheiden – Kostenlos/Pro/Enterprise erhalten unterschiedliche Limits
Kernfähigkeiten
| Bereich | Technologien |
|---|---|
| Algorithmen | Token Bucket, Sliding Window Log, Sliding Window Counter, Fixed Window |
| Speicher | Redis 7.4+, Valkey, DragonflyDB, In-Memory (Einzelknoten) |
| Bibliotheken | rate-limiter-flexible, @upstash/ratelimit, express-rate-limit |
| Gateway-Plugins | Kong rate-limiting, Nginx limit_req, Traefik ratelimit |
| Standards | RFC 6585 (429), RateLimit-Header (draft-ietf-httpapi-ratelimit) |
Architekturmuster
Sliding Window Counter (Redis Lua)
-- Redis Lua-Skript: Sliding-Window-Ratenbegrenzer
-- KEYS[1] = Ratenbegrenzungsschlüssel
-- ARGV[1] = Fenstergröße (Sekunden)
-- ARGV[2] = Maximale Anfragen
-- ARGV[3] = Aktueller Zeitstempel
local key = KEYS[1]
local window = tonumber(ARGV[1])
local limit = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
-- Entferne abgelaufene Einträge
redis.call('ZREMRANGEBYSCORE', key, 0, now - window)
-- Zähle aktuelles Fenster
local count = redis.call('ZCARD', key)
if count < limit then
redis.call('ZADD', key, now, now .. '-' .. math.random(1000000))
redis.call('EXPIRE', key, window)
return {1, limit - count - 1} -- erlaubt, verbleibend
else
return {0, 0} -- verweigert, 0 verbleibend
end
Mehrstufige Ratenbegrenzung
Anfrage → IP-Ratenlimit (100/Minute)
│ bestanden
↓
Authentifizierungsprüfung → API-Schlüssel-Ratenlimit (tarifbasiert)
│ Kostenlos: 60/Minute
│ Pro: 600/Minute
│ Enterprise: 6000/Minute
↓ bestanden
Endpunkt-Ratenlimit (pro Route)
│ POST /upload: 10/Minute
│ GET /search: 120/Minute
↓ bestanden
Anfrage verarbeiten
Antwort-Header (IETF-Entwurfsstandard)
// Middleware: Ratenlimit-Header anhängen
function rateLimitHeaders(limit: number, remaining: number, resetAt: number) {
return {
'RateLimit-Limit': limit.toString(),
'RateLimit-Remaining': Math.max(0, remaining).toString(),
'RateLimit-Reset': Math.ceil((resetAt - Date.now()) / 1000).toString(),
};
}
// Bei 429-Antwort:
res.status(429).set({
...rateLimitHeaders(limit, 0, resetAt),
'Retry-After': Math.ceil((resetAt - Date.now()) / 1000).toString(),
}).json({ error: 'Too Many Requests', retryAfter: resetAt });
Anti-Patterns
- In-Memory-Zähler in verteilten Systemen – Ratenlimits müssen über Instanzen hinweg gemeinsam genutzt werden; verwenden Sie Redis oder Äquivalent
- Fehlender Retry-After-Header – 429-Antworten ohne
Retry-Afterzwingen Clients zum Raten, was zu einer Herde von Anfragen führt - Nur-IP-Ratenbegrenzung – IP-Limits übersehen authentifizierten Missbrauch und bestrafen gemeinsam genutzte IPs (NAT, VPN); kombinieren Sie mit API-Schlüssel-Limits
- Harter Cutoff ohne Burst – Token Bucket erlaubt kleine Bursts bei gleichbleibender Durchschnittsrate; reines Fixed Window ist zu starr
- Keine Ratenbegrenzung für interne APIs – Ein fehlverhaltender interner Dienst kann Ihre Datenbank kaskadenartig zum Absturz bringen; limitieren Sie immer
Qualitäts-Checkliste
- Ratenlimits verwenden verteilten Speicher (Redis/Valkey), nicht In-Memory
-
RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset-Header bei jeder Antwort -
Retry-After-Header bei 429-Antworten - Unterschiedliche Limits pro Authentifizierungstarif (Kostenlos/Pro/Enterprise)
- Pro-Endpunkt-Limits für teure Operationen (Uploads, Suche)
- Lua-Skript oder atomare Pipeline für Zählererhöhung (keine Wettlaufsituationen)
- Ratenlimitschlüssel enthalten sowohl Identität (API-Schlüssel) als auch Geltungsbereich (Endpunkt)
- Monitoring-Dashboard zeigt Ratenlimit-Treffer, -Ablehnungen und -Spitzenverbraucher
- Graceful Degradation: Nach Möglichkeit in die Warteschlange stellen oder verlangsamen statt hart abzulehnen