Sobes.tech
Junior — Middle

Jak w systemie realizowany jest mechanizm ograniczania liczby zapytań w jednostce czasu?

sobes.tech AI

Odpowiedź od AI

Mechanizm ograniczania liczby żądań w jednostce czasu (rate limiting) w Go jest często implementowany za pomocą tokenów lub liczników z oknem czasowym.

Przykład z użyciem pakietu golang.org/x/time/rate:

import (
    "golang.org/x/time/rate"
    "net/http"
)

var limiter = rate.NewLimiter(1, 5) // 1 żądanie na sekundę z maksymalnie 5 tokenami

func handler(w http.ResponseWriter, r *http.Request) {
    if !limiter.Allow() {
        http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
        return
    }
    // obsługa żądania
}

Tutaj, rate.NewLimiter tworzy limitator, który pozwala na 1 żądanie na sekundę, ale może akumulować do 5 tokenów, co pozwala na krótkie skoki w liczbie żądań. Jeśli jest ich zbyt wiele, są odrzucane z błędem 429.

Inne podejścia obejmują stałe okno, okno przesuwne lub użycie Redis do rozproszonego limitowania.