Lua Academy · Oppitunti

Nopeusrajoitus Lualla

Toteuttakaa liukuvan ikkunan nopeusrajoittimet atomisesti Redis Luassa.

Oppitunti 3/413 vaihetta

Nopeusrajoitus Lualla on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Miksi Redis pyyntöjen rajoittamiseen

Redis tarjoaa atomiset operaatiot, muistissa toimivan nopeuden ja useiden sovelluspalvelinten yhteisen tilan — siksi se sopii erinomaisesti hajautettuun pyyntöjen rajoittamiseen.

Yksinkertainen kiinteän aikajakson laskuri

Laskekaa pyynnöt aikajaksoittain INCR- ja EXPIRE-komennoilla.

EVAL "
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local count = redis.call('INCR', key)
if count == 1 then
  redis.call('EXPIRE', key, window)
end
if count > limit then
  return 0  -- rejected
end
return 1  -- allowed
" 1 rate:user:123 100 60

Liukuva aikajakso järjestetyillä joukoilla

Tarkempi pyyntörajoitin käyttää aikaleiman mukaan järjestettyä joukkoa. Poistakaa vanhat merkinnät, lisätkää nykyinen pyyntö ja laskekaa joukon koko.

EVAL "
local key = KEYS[1]
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
redis.call('ZREMRANGEBYSCORE', key, 0, now - window * 1000)
redis.call('ZADD', key, now, now .. math.random())
redis.call('EXPIRE', key, window)
local count = redis.call('ZCARD', key)
if count > limit then return 0 end
return 1
" 1 slidingRate:user:123 1706000000000 60 100

Token bucket -algoritmi

Token bucket mahdollistaa purskeet ja säilyttää samalla keskimääräisen nopeuden. Täyttäkää tokeneita ajan kuluessa; jokainen pyyntö kuluttaa yhden tokenin.

Leaky bucket -algoritmi

Leaky bucket -algoritmi pakottaa tiukan vakionopeuden. Pyynnöt asetetaan jonoon (ämpäriin) ja käsitellään kiinteällä tyhjennysnopeudella. Ylivuotavat pyynnöt hylätään.

Käyttäjä- ja IP-kohtaiset rajoitukset

Avainnettakaa pyyntörajoitin käyttäjätunnuksen, API-avaimen tai IP-osoitteen perusteella: rate:{userId}, rate:{ip}, rate:{apiKey}.

Porrastetut pyyntörajoitukset

Soveltakaa eri rajoituksia käyttäjätason perusteella (free tai pro). Tarkistakaa käyttäjän taso ennen käytettävän rajoituksen valitsemista.

EVAL "
local tier = redis.call('HGET', 'user:tier', ARGV[1])
local limit = tier == 'pro' and 10000 or 1000
-- ... rest of rate limit check
" 0 "userId123"

Otsakkeiden palauttaminen

Palauttakaa skriptistä jäljellä oleva pyyntömäärä ja nollautumisaika, jotta sovellus voi asettaa X-RateLimit-otsakkeet HTTP-vastaukseen.

return {allowed, limit - count, resetTime}

Hajautettu atomisuustakuu

Koska koko pyyntörajatarkistus on yhdessä EVAL-skriptissä, se on atominen kaikissa Redis-klusteria jakavissa sovelluspalvelininstansseissa.

Redis Cluster -huomautus

Redis Cluster -tilassa kaikkien skriptissä käytettävien KEYS-avainten on hajaututtava samaan slottiin. Käyttäkää hajautustunnisteita: rate:{user123}:requests pakottaaksenne avaimet samaan sijaintiin.

Pyyntörajoitusten valvonta

Kirjatkaa hylätyt pyynnöt käyttäjä- ja IP-tietoineen. Asettakaa hälytykset, jotka aktivoituvat hylkäysmäärien kasvaessa nopeasti (mikä voi viitata hyökkäykseen tai virheelliseen määritykseen).

Pyyntöjen rajoittamista koskeva kysymys

Miksi Redis Lua -skripti on pyyntöjen rajoittamiseen parempi kuin sovelluksen puolella ylläpidettävät laskurit?

Kertaus: pyyntöjen rajoittaminen Lualla

Toteuttakaa pyyntörajoittimet Redis Lualla käyttäen INCR+EXPIRE-yhdistelmää (kiinteä aikajakso) tai järjestettyjä joukkoja (liukuva aikajakso). Atominen skripti takaa oikeellisuuden hajautetuissa sovelluspalvelimissa. Palauttakaa jäljellä oleva kiintiö HTTP-otsakkeita varten.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Nopeusrajoitus Lualla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Nopeusrajoitus Lualla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Nopeusrajoitus Lualla”?

Toteuttakaa liukuvan ikkunan nopeusrajoittimet atomisesti Redis Luassa. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Nopeusrajoitus Lualla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. EVAL ja Redisin Lua-ympäristö
  2. Atomiset operaatiot ja transaktiot
  3. Nopeusrajoitus Lualla
  4. SCRIPT LOAD ja EVALSHA
← Takaisin: Lua Academy