Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams) · Oppitunti

Nopeusrajoitus ja haitalliset mallit

Suunnitelkaa ja toteuttakaa tehokkaita nopeusrajoitusmekanismeja Redisillä sovellusrajapintojen ja palvelujen suojaamiseksi.

Oppitunti 3/411 vaihetta

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:

  1. Määritetään kiinteä aikaikkuna (esimerkiksi 60 sekuntia).
  2. Lasketaan kyseisen aikaikkunan aikana saapuvat pyynnöt.
  3. 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:

  1. Jokaisen pyynnön aikaleima tallennetaan Redis Sorted Set (ZSET) -tietorakenteeseen.
  2. Kun uusi pyyntö saapuu, vanhat aikaleimat (nykyisen aikaikkunan ulkopuolelta) poistetaan.
  3. 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) ja Retry-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, ZADD ja EXPIRE, 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!

Aloita maksutta

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

  1. Edistyneet välimuistimallit
  2. Istuntojen hallinta Redisillä
  3. Nopeusrajoitus ja haitalliset mallit
  4. Välimuistin mitätöintistrategiat
← Takaisin: Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)