0Pricing
Go Academy · Lekcja

Koncepcja wiadra tokenów

Ograniczaj częstotliwość żądań

Koncepcja wiadra tokenów to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Dlaczego stosować ograniczanie częstotliwości

Ograniczanie częstotliwości określa maksymalną liczbę operacji wykonywanych w jednostce czasu. Chroni API przed nadużyciami, pozwala przestrzegać limitów usług zewnętrznych i pomaga utrzymać stabilność systemów pod obciążeniem.

  • Zapobiega przeciążeniu
  • Wymusza sprawiedliwe korzystanie z zasobów
  • Przestrzega limitów usług nadrzędnych

Model wiadra tokenów

Wyobraźmy sobie wiadro, w którym przechowywane są tokeny. Każde żądanie musi pobrać token, aby móc kontynuować. Tokeny są uzupełniane ze stałą szybkością. Jeśli wiadro jest puste, żądanie czeka albo zostaje odrzucone.

rate i burst

Wiadro tokenów definiują dwa parametry: rate (liczba tokenów dodawanych w ciągu sekundy) oraz burst (pojemność wiadra). Burst pozwala na krótkotrwałe skoki powyżej stałej szybkości.

Uzupełnianie w czasie

Jeśli rate wynosi 5 tokenów na sekundę, jeden token pojawia się mniej więcej co 200 milisekund. Wiadro nigdy nie zawiera więcej tokenów niż wynosi jego pojemność burst, więc niewykorzystane miejsce nie gromadzi tokenów bez końca.

Obsługa burstów

Burst równy 10 oznacza, że jeśli wiadro jest pełne, można natychmiast wykonać do 10 żądań. Następnie żądania są obsługiwane ze stałą szybkością. Pozwala to połączyć szybkość reakcji z kontrolą obciążenia.

Proste ograniczanie na podstawie czasu

Ograniczanie częstotliwości można przybliżyć za pomocą tickera, który w stałych odstępach czasu udostępnia pozwolenie. Każde żądanie czeka na kolejny tick.

ticker := time.NewTicker(200 * time.Millisecond)
defer ticker.Stop()
for i := 0; i < 3; i++ {
    <-ticker.C
    fmt.Println("request", i)
}

Token bucket a leaky bucket

Leaky bucket opróżnia się ze stałą szybkością i całkowicie wygładza wyjście, nie dopuszczając do burstów. Token bucket pozwala na bursti o rozmiarze nieprzekraczającym jego pojemności. Token bucket jest częściej używany do ograniczania limitów API.

Minimalna symulacja wiadra

Ten uruchamialny przykład symuluje wiadro tokenów o pojemności 3, uzupełniane co 100 ms, i pokazuje, które żądania są dozwolone.

package main

import (
    "fmt"
    "time"
)

func main() {
    tokens := 3
    last := time.Now()
    rate := 100 * time.Millisecond
    for i := 0; i < 6; i++ {
        elapsed := time.Since(last)
        refill := int(elapsed / rate)
        if refill > 0 {
            tokens += refill
            if tokens > 3 {
                tokens = 3
            }
            last = time.Now()
        }
        if tokens > 0 {
            tokens--
            fmt.Println("request", i, "allowed")
        } else {
            fmt.Println("request", i, "rejected")
        }
        time.Sleep(40 * time.Millisecond)
    }
}

Allow, Wait czy Reserve

Limitery zwykle oferują trzy sposoby działania: Allow natychmiast zwraca wartość true lub false, Wait blokuje wykonanie do czasu udostępnienia tokenu, a Reserve informuje, jak długo należy czekać. Wybór zależy od tego, czy można blokować wykonanie.

Gdzie umieszczać limity

Limity częstotliwości mogą obowiązywać dla klienta, endpointu albo globalnie. Mapa limiterów indeksowana adresem IP klienta pozwala egzekwować limity poszczególnych klientów, a jeden współdzielony limiter ogranicza całkowitą przepustowość.

Dobieranie parametrów

Rate należy dopasować do limitu usługi podrzędnej. Jeśli API pozwala na 600 żądań na minutę, należy ustawić rate na 10 na sekundę. Parametr burst powinien absorbować oczekiwane skoki, nie przekraczając średniej szybkości.

Szybki test

Proszę sprawdzić zrozumienie modelu wiadra tokenów.

Podsumowanie

Poznali Państwo koncepcję token bucket:

  • Tokeny są zużywane przy każdym żądaniu i uzupełniane z określoną szybkością
  • Burst określa pojemność wiadra obsługującą krótkotrwałe skoki
  • Token bucket pozwala na bursti, a leaky bucket nie
  • Allow, Wait i Reserve to typowe API

Często zadawane pytania

Czy lekcja „Koncepcja wiadra tokenów” jest bezpłatna?

Tak — pełny tekst „Koncepcja wiadra tokenów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Koncepcja wiadra tokenów”?

Ograniczaj częstotliwość żądań Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Koncepcja wiadra tokenów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Koncepcja wiadra tokenów
  2. golang.org/x/time/rate
  3. Ograniczanie goroutines
  4. Wycofywanie i ponawianie
← Powrót do Go Academy