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
- Koncepcja wiadra tokenów
- golang.org/x/time/rate
- Ograniczanie goroutines
- Wycofywanie i ponawianie