Nopeusrajoitus ja haitalliset mallit
Suunnitelkaa ja toteuttakaa tehokkaita nopeusrajoitusmekanismeja Redisillä sovellusrajapintojen ja palvelujen suojaamiseksi.
Nopeusrajoitus ja haitalliset mallit on ilmainen Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-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 Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-kurssilla on yhteensä 4 oppituntia.
Miksi nopeusrajoituksia käytetään?
Rate limiting eli pyyntöjen nopeusrajoitus on tärkeä tekniikka, jolla hallitaan sovelluksen vastaanottamien pyyntöjen tiheyttä. Sitä voi ajatella yökerhon ovimiehenä, joka päästää sisään vain tietyn määrän ihmisiä kerrallaan.
Se suojaa rajapintojanne ja palveluitanne seuraavilta:
- Väärinkäytöltä: Estämällä haitalliset hyökkäykset, kuten brute force -yritykset.
- Ylikuormitukselta: Varmistamalla, etteivät liian monet pyynnöt kuormita palvelimia liikaa.
- Reilulta käytöltä: Jakamalla käyttöoikeudet tasapuolisesti kaikkien käyttäjien kesken.
Nopeusrajoituksen käsitteet
Nopeusrajoituksista puhuttaessa esiin nousee muutama keskeinen termi:
- Raja: Suurin sallittu pyyntöjen määrä.
- Aikaikkuna: Ajanjakso, jonka aikana rajaa sovelletaan (esimerkiksi 60 sekuntia).
- Piikki: Pyyntöjen äkillinen lisääntyminen.
Käytettävissä on erilaisia algoritmeja, kuten Fixed Window ja Sliding Window, joilla kullakin on omat kompromissinsa.
Redisin rooli nopeusrajoituksissa
Redis sopii erinomaisesti nopeusrajoitusten toteuttamiseen nopeutensa, muistissa toimivan luonteensa ja atomisten operaatioidensa ansiosta.
Sen kyky kasvattaa laskureita nopeasti ja määrittää vanhenemisaikoja tekee siitä ihanteellisen pyyntöjen tiheyden seurantaan hajautetussa järjestelmässä.
Fixed Window -algoritmi
Fixed Window -algoritmi on yksi yksinkertaisimmista toteuttaa. Se toimii seuraavasti:
- Määritetään kiinteä aikaikkuna (esimerkiksi 60 sekuntia).
- Lasketaan kyseisen aikaikkunan aikana saapuvat pyynnöt.
- Estetään pyynnöt, kun raja saavutetaan.
Jokaisen aikaikkunan lopussa laskuri nollataan. Menetelmä on suoraviivainen, mutta se voi sallia pyyntöpiikkejä aikaikkunoiden rajakohdissa.
Fixed Window käytännössä
Näin voitte toteuttaa Redisillä perusmuotoisen Fixed Window -nopeusrajoittimen komennoilla INCR ja EXPIRE.
Suorittakaa tämä Python-esimerkki:
import redis
import time
r = redis.Redis(decode_responses=True)
def check_rate_limit(user_id, limit_per_min):
key = f"rl:{user_id}"
# Increment counter for the user
current_count = r.incr(key)
# If it's the first request in this window, set expiration
if current_count == 1:
r.expire(key, 60) # Expire in 60 seconds
return current_count <= limit_per_min
if __name__ == "__main__":
test_user = "user_A"
rate_limit = 3 # 3 requests per minute
print(f"User '{test_user}' limit: {rate_limit} req/min")
for i in range(1, 6):
if check_rate_limit(test_user, rate_limit):
print(f"Request {i}: ALLOWED")
else:
print(f"Request {i}: BLOCKED")
time.sleep(0.5) # Simulate quick requests
print("\nWaiting for 60s window to reset...")
# In a real app, this delay would be handled by subsequent requests
# For demo, we'll clear the key
r.delete(f"rl:{test_user}")
time.sleep(1) # Small pause
print("Window reset. New request:")
if check_rate_limit(test_user, rate_limit):
print("Request 1: ALLOWED")
else:
print("Request 1: BLOCKED")Sliding Window Log -algoritmi
Sliding Window Log -algoritmi tarjoaa paremman tarkkuuden seuraamalla yksittäisten pyyntöjen aikaleimoja.
Se toimii seuraavasti:
- Jokaisen pyynnön aikaleima tallennetaan Redis Sorted Set (ZSET) -tietorakenteeseen.
- Kun uusi pyyntö saapuu, vanhat aikaleimat (nykyisen aikaikkunan ulkopuolelta) poistetaan.
- ZSET-tietorakenteeseen jäljelle jääneiden aikaleimojen määrä on nykyinen pyyntömäärä.
Tämä menetelmä estää kiinteiden aikaikkunoiden rajakohdissa ilmenevän piikkiongelman.
Sliding Window -esimerkki
Katsotaan Sliding Window Log -algoritmia käytännössä. Lisäämme aikaleimat komennolla ZADD ja poistamme vanhat aikaleimat komennolla ZREMRANGEBYSCORE.
Suorittakaa tämä esimerkki:
import redis
import time
r = redis.Redis(decode_responses=True)
def check_sliding_window_limit(user_id, limit, window_seconds):
key = f"rl_sliding:{user_id}"
current_time = int(time.time() * 1000) # Milliseconds timestamp
# Remove scores older than the window
r.zremrangebyscore(key, 0, current_time - (window_seconds * 1000))
# Add current request timestamp
r.zadd(key, {current_time: current_time})
# Set expiration for the key itself to clean up old rate limiters
# This is a fallback if no new requests come for a long time
r.expire(key, window_seconds + 5)
# Count requests in the window
current_requests = r.zcard(key)
return current_requests <= limit
if __name__ == "__main__":
test_user = "user_B"
rate_limit = 3 # 3 requests per 10 seconds
window = 10 # seconds
print(f"User '{test_user}' limit: {rate_limit} req/{window}s (Sliding Log)")
for i in range(1, 6):
if check_sliding_window_limit(test_user, rate_limit, window):
print(f"Request {i}: ALLOWED")
else:
print(f"Request {i}: BLOCKED")
time.sleep(1) # Simulate requests over time
print("\nWaiting for window to slide...")
time.sleep(window)
print("Window slid. New request:")
if check_sliding_window_limit(test_user, rate_limit, window):
print("Request 1: ALLOWED")
else:
print("Request 1: BLOCKED")Yleiset sudenkuopat
Välttäkää nopeusrajoituksia toteuttaessanne nämä yleiset anti-patternit:
- Komennon
KEYS *käyttäminen: Älkää koskaan käyttäkö tätä tuotannossa nopeusrajoitusavainten etsimiseen, sillä se voi estää Redis-palvelimen toiminnan. - Piikkien sivuuttaminen: Yksinkertaiset kiinteät aikaikkunat voivat sallia useita pyyntöjä aikaikkunoiden rajakohdissa, mikä saattaa edelleen ylikuormittaa palveluanne.
- Ylisunnittelu: Älkää tehkö nopeusrajoituslogiikasta tarpeettoman monimutkaista, koska se voi aiheuttaa virheitä ja suorituskykykustannuksia.
- Palautteen puuttuminen asiakkaalle: Palauttakaa aina asianmukaiset HTTP-tilakoodit (kuten
429 Too Many Requests) jaRetry-After-otsakkeet.
Nopeusrajoituksen parhaat käytännöt
Voitte rakentaa Redisillä vankkoja nopeusrajoittimia seuraavasti:
- Atomiset operaatiot: Käyttäkää aina atomisia Redis-komentoja, kuten
INCR,ZADDjaEXPIRE, kilpailutilanteiden estämiseksi. - Vanhenemisaikojen määrittäminen: Varmistakaa, että Redis-avaimilla on asianmukaiset Time-To-Live (TTL) -arvot vanhojen tietojen siivoamista varten.
- Valitkaa harkiten: Valitkaa tarpeisiinne sopiva algoritmi (fixed, sliding log tai sliding counter) tarkkuus- ja suorituskykyvaatimusten perusteella.
- Palautteen antaminen: Ilmoittakaa asiakkaille nopeusrajoituksen saavuttamisesta standardien HTTP-vastausten avulla.
- Valvonta: Seuratkaa nopeusrajoittimianne varmistaaksenne, että ne toimivat odotetusti eivätkä aiheuta vääriä positiivisia tai negatiivisia tuloksia.
Testaa tietosi
Olette oppineet Fixed Window -algoritmista. Testataan nyt ymmärrystänne siihen liittyvistä Redis-komennoista.
Kertaus ja seuraavat vaiheet
Tässä oppitunnissa tarkastelimme nopeusrajoituksen keskeistä roolia palveluiden suojaamisessa ja reilun käytön varmistamisessa. Opitte, että Redisin nopeus ja atomiset operaatiot tekevät siitä ihanteellisen työkalun tähän tarkoitukseen.
Käsittelimme kahta keskeistä algoritmia: Fixed Window -algoritmia (komentojen INCR ja EXPIRE avulla) sekä tarkempaa Sliding Window Log -algoritmia (komentojen ZADD ja ZREMRANGEBYSCORE avulla).
Muistakaa välttää yleisiä anti-patterneja ja noudattaa vankkojen nopeusrajoitusten parhaita käytäntöjä. Harjoitelkaa näitä rakenteita, jotta opitte hallitsemaan ne!
Opi Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams) 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
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Nopeusrajoitus ja haitalliset mallit” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppimispolun 3 oppituntia, myös oppitunnin “Nopeusrajoitus ja haitalliset mallit”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Nopeusrajoitus ja haitalliset mallit”?
Suunnitelkaa ja toteuttakaa tehokkaita nopeusrajoitusmekanismeja Redisillä sovellusrajapintojen ja palvelujen suojaamiseksi. Harjoittelet Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-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 ja haitalliset mallit”-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ä Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppitunnilla?
Kyllä. Jokainen Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-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
- Edistyneet välimuistimallit
- Istuntojen hallinta Redisillä
- Nopeusrajoitus ja haitalliset mallit
- Välimuistin mitätöintistrategiat