Distribueret rate limiting
Koordinér request-grænser på tværs af mange app-instanser med Redis-tællere og atomare Lua-scripts til fixed-window-, sliding-window- og token-bucket-algoritmer.
Distribueret rate limiting er en gratis Redis-caching og meddelelser (Pub/Sub, Streams)-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Redis-caching og meddelelser (Pub/Sub, Streams), og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Redis-caching og meddelelser (Pub/Sub, Streams)-kurset indeholder 4 lektioner i alt.
Lokale begrænsninger skalerer ikke
En hastighedsbegrænser i hukommelsen tæller kun forespørgsler på én server. Med mange app-instanser bag en load balancer har du brug for et delt overblik over brugen. Redis er centralt og atomisk og er derfor det naturlige koordinationspunkt.
Tæller for fast tidsvindue
Den enkleste algoritme: én tæller pr. tidsvindue. Udfør INCR på nøglen, og angiv en TTL, der svarer til vinduet, ved den første forøgelse. Afvis, når antallet overskrider grænsen.
INCR rl:user:42:1716900000
EXPIRE rl:user:42:1716900000 60Kapløbstilstanden
Hvis du udfører INCR og derefter EXPIRE som to kommandoer, risikerer du en nøgle uden TTL, hvis klienten dør imellem dem. Et atomisk Lua-script løser dette ved at køre begge som én operation.
local c = redis.call('INCR', KEYS[1])
if c == 1 then redis.call('EXPIRE', KEYS[1], ARGV[1]) end
return cHvorfor atomicitet er vigtig
På tværs af mange instanser kan samtidige forespørgsler ellers læse og skrive tællere i en sammenflettet rækkefølge. Lua-scripts kører atomisk på serveren, så hele kontrollen og forøgelsen sker uden sammenfletning.
Problemet med bursts ved faste tidsvinduer
Faste tidsvinduer tillader bursts ved grænsen: En klient kan sende en hel vinduesmængde i slutningen af ét vindue og igen i begyndelsen af det næste, så den effektive hastighed fordobles.
Log for glidende tidsvindue
Et sorteret sæt af tidsstempler for forespørgsler giver et præcist glidende tidsvindue. Fjern gamle poster, tæl de resterende, og tilføj den nye forespørgsel – alt sammen i ét script.
ZREMRANGEBYSCORE rl:user:42 0 (now-window)
ZCARD rl:user:42
ZADD rl:user:42 now nowToken-spand
En token-spand tillader kontrollerede bursts. Tokens fyldes op med en fast hastighed op til en grænse; hver forespørgsel bruger én. Gem tokens og tidspunktet for seneste opfyldning i en hash, og opdatér atomisk med Lua.
HSET rl:tb:user:42 tokens 10 ts 1716900000Logik for opfyldning
Beregn den forløbne tid ved hver forespørgsel, tilføj elapsed * rate tokens (begrænset til spandens størrelse), og tillad derefter forespørgslen, hvis der er mindst én token tilbage. Lua-scriptet holder dette konsistent på tværs af instanser.
Valg af algoritme
Fast tidsvindue: billigst, men tillader bursts ved grænsen. Glidende log: præcis, men bruger mere hukommelse. Token-spand: jævn med kontrollerede bursts og velegnet til API'er.
Returnering af nyttige headere
Fortæl klienterne om deres begrænsninger: returnér antallet af resterende forespørgsler og nulstillingstidspunktet, så velfungerende klienter selv kan begrænse hastigheden.
# X-RateLimit-Remaining: 7
# X-RateLimit-Reset: 1716900060Bemærkning om robusthed
Beslut, hvilken fallback der skal bruges, hvis Redis ikke kan nås: fail open (tillad trafik) af hensyn til tilgængeligheden eller fail closed (afvis) af hensyn til beskyttelsen. Det rigtige valg afhænger af, om begrænsningen beskytter omkostninger eller korrekthed.
Hurtigt tjek
Test din forståelse af distribueret hastighedsbegrænsning.
Opsummering
Du har opbygget distribueret hastighedsbegrænsning på Redis: tællere for faste tidsvinduer, atomisk Lua for at undgå TTL-lækager og kapløbstilstande, logge for glidende tidsvinduer med sorterede sæt samt token-spande til jævne bursts. Ved at centralisere tællerne bliver begrænsningerne ens på tværs af alle app-instanser; vælg bevidst din fallback mellem fail open og fail closed.
Lær Redis-caching og meddelelser (Pub/Sub, Streams) med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “Distribueret rate limiting” gratis?
Ja — alle 3 lektioner i læringssporet Redis-caching og meddelelser (Pub/Sub, Streams), inklusive “Distribueret rate limiting”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Redis-caching og meddelelser (Pub/Sub, Streams)-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Distribueret rate limiting”?
Koordinér request-grænser på tværs af mange app-instanser med Redis-tællere og atomare Lua-scripts til fixed-window-, sliding-window- og token-bucket-algoritmer. Du øver dig i Redis-caching og meddelelser (Pub/Sub, Streams) med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Redis-caching og meddelelser (Pub/Sub, Streams)?
Der kræves ingen tidligere erfaring. Redis-caching og meddelelser (Pub/Sub, Streams) på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Distribueret rate limiting”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Redis-caching og meddelelser (Pub/Sub, Streams)-lektion?
Ja. Alle Redis-caching og meddelelser (Pub/Sub, Streams)-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Distribuerede locks med Redis
- Mønstre for leader election
- Redis som koordineringstjeneste
- Distribueret rate limiting