Distribuert hastighetsbegrensning
Samordne forespørselsgrenser på tvers av mange appinstanser ved hjelp av Redis-tellere og atomiske Lua-skript for algoritmene fixed window, sliding window og token bucket.
Distribuert hastighetsbegrensning er en gratis leksjon i Redis-bufring og meldinger (Pub/Sub, Streams) på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Redis-bufring og meldinger (Pub/Sub, Streams), og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Redis-bufring og meldinger (Pub/Sub, Streams) inneholder totalt 4 leksjoner.
Lokale grenser skalerer ikke
En hastighetsbegrenser i minnet teller bare forespørsler på én server. Når mange appinstanser ligger bak en lastbalanserer, trenger du en delt oversikt over bruken. Redis er sentral og atomisk og er derfor det naturlige koordineringspunktet.
Teller for fast tidsvindu
Den enkleste algoritmen er en teller per tidsvindu. Kjør INCR på key-en, og angi en TTL som tilsvarer vinduet ved første inkrementering. Avvis forespørselen når telleren overstiger grensen.
INCR rl:user:42:1716900000
EXPIRE rl:user:42:1716900000 60Kappløpstilstanden
Hvis du kjører INCR og deretter EXPIRE som to kommandoer, kan key-en bli stående uten TTL hvis klienten avsluttes imellom. Et atomisk Lua-skript løser dette ved å kjøre begge som én operasjon.
local c = redis.call('INCR', KEYS[1])
if c == 1 then redis.call('EXPIRE', KEYS[1], ARGV[1]) end
return cHvorfor atomisitet er viktig
På tvers av mange instanser kan samtidige forespørsler ellers lese og skrive tellere i en sammenflettet rekkefølge. Lua-skript kjøres atomisk på serveren, slik at hele kontrollen og inkrementeringen skjer uten innblanding fra andre operasjoner.
Problemet med opphopning i faste tidsvinduer
Faste tidsvinduer tillater opphopning ved grensen: En klient kan sende en hel vindusmengde på slutten av ett vindu og deretter gjøre det samme i begynnelsen av det neste. Den effektive hastigheten blir dermed doblet.
Glidende vinduslogg
Et sortert sett med tidsstempler for forespørsler gir et presist glidende tidsvindu. Fjern gamle oppføringer, tell de gjenværende og legg til den nye forespørselen, alt i ett skript.
ZREMRANGEBYSCORE rl:user:42 0 (now-window)
ZCARD rl:user:42
ZADD rl:user:42 now nowTokenbøtte
Tokenbøtten tillater kontrollerte opphopninger. Tokens fylles på med en fast hastighet opp til en grense, og hver forespørsel bruker ett token. Lagre antall tokens og tidspunktet for siste påfylling i en hash, og oppdater atomisk med Lua.
HSET rl:tb:user:42 tokens 10 ts 1716900000Logikk for påfylling
Beregn tiden som har gått ved hver forespørsel, legg til elapsed * rate tokens (begrenset til bøttestørrelsen), og tillat deretter forespørselen hvis minst ett token gjenstår. Lua-skriptet sørger for at dette er konsistent på tvers av instansene.
Velge en algoritme
Fast tidsvindu: billigst, men tillater opphopning ved grensen. Glidende logg: presis, men bruker mer minne. Tokenbøtte: jevn med kontrollerte opphopninger og svært godt egnet for API-er.
Returnere nyttige headere
Informer klientene om grensene deres: returner antall gjenværende forespørsler og tidspunktet for tilbakestilling, slik at klienter som oppfører seg riktig, kan begrense hastigheten selv.
# X-RateLimit-Remaining: 7
# X-RateLimit-Reset: 1716900060Merknad om robusthet
Bestem hva som skal skje hvis Redis ikke er tilgjengelig: fail open (tillat trafikk) for tilgjengelighetens skyld, eller fail closed (avvis trafikk) for beskyttelse. Det riktige valget avhenger av om grensen beskytter kostnader eller korrekthet.
Sjekk deg selv
Test forståelsen din av distribuert hastighetsbegrensning.
Oppsummering
Du har bygget distribuert hastighetsbegrensning med Redis: tellere for faste tidsvinduer, atomisk Lua for å unngå tapte TTL-er og kappløpstilstander, logger for glidende tidsvinduer med sorterte sett og tokenbøtter for jevne opphopninger. Når tellerne sentraliseres, blir grensene konsistente på tvers av alle appinstanser. Velg reserveløsningen mellom fail open og fail closed bevisst.
Lær deg Redis-bufring og meldinger (Pub/Sub, Streams) med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Distribuert hastighetsbegrensning» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Redis-bufring og meldinger (Pub/Sub, Streams), inkludert «Distribuert hastighetsbegrensning», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Redis-bufring og meldinger (Pub/Sub, Streams) inneholder totalt 4 leksjoner.
Hva lærer jeg i «Distribuert hastighetsbegrensning»?
Samordne forespørselsgrenser på tvers av mange appinstanser ved hjelp av Redis-tellere og atomiske Lua-skript for algoritmene fixed window, sliding window og token bucket. Du øver på Redis-bufring og meldinger (Pub/Sub, Streams) med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Redis-bufring og meldinger (Pub/Sub, Streams)?
Ingen tidligere erfaring er nødvendig. Redis-bufring og meldinger (Pub/Sub, Streams) på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Distribuert hastighetsbegrensning»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Redis-bufring og meldinger (Pub/Sub, Streams)-leksjonen?
Ja. Alle Redis-bufring og meldinger (Pub/Sub, Streams)-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Distribuerte låser med Redis
- Mønstre for ledervalg
- Redis som koordineringstjeneste
- Distribuert hastighetsbegrensning