golang.org/x/time/rate
Używaj ogranicznika częstotliwości
golang.org/x/time/rate to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 2 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.
Pakiet rate
golang.org/x/time/rate udostępnia gotowy do użycia w produkcji token bucket Limiter. Jest to standardowy wybór do ograniczania częstotliwości w Go.
- Implementacja sprawdzona w praktyce
- Metody Allow, Wait i Reserve
- Obsługa context
Tworzenie limitera
rate.NewLimiter przyjmuje rate (liczbę tokenów na sekundę) oraz rozmiar burst. rate.Limit to wartość typu float64 określająca liczbę zdarzeń na sekundę.
limiter := rate.NewLimiter(rate.Limit(10), 5)rate.Every
Jeśli wygodniej jest myśleć o odstępach czasu niż o szybkości na sekundę, rate.Every konwertuje czas trwania na rate. Jedno zdarzenie co 200 ms odpowiada pięciu zdarzeniom na sekundę.
limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)Allow
Allow informuje, czy w tej chwili dostępny jest token. Zwraca true i zużywa token albo natychmiast zwraca false. Należy używać go do odrzucania nadmiarowych żądań.
if !limiter.Allow() {
fmt.Println("rejected: too many requests")
return
}Wait
Wait blokuje wykonanie do czasu udostępnienia tokenu albo anulowania contextu. Jest idealny, gdy praca ma być wykonywana w równym tempie, zamiast odrzucania zadań.
if err := limiter.Wait(ctx); err != nil {
return err
}
doWork()Reserve
Reserve zwraca obiekt Reservation opisujący czas oczekiwania. Wywołanie Delay() pozwala sprawdzić czas oczekiwania, a Cancel() — anulować rezerwację, jeśli podjęto decyzję o rezygnacji z wykonania.
r := limiter.Reserve()
if !r.OK() {
return
}
time.Sleep(r.Delay())Uwaga: pakiet zewnętrzny
Pakiet rate nie należy do biblioteki standardowej, dlatego wymaga polecenia go get golang.org/x/time/rate oraz modułu. Fragmenty importujące ten pakiet mają charakter ilustracyjny i nie są tutaj uruchamiane w tekście.
Uruchamialny odpowiednik z biblioteki standardowej
Ponieważ pakiet rate jest zewnętrzny, poniżej przedstawiono opartą na bibliotece standardowej pętlę regulującą tempo pracy, która imituje działanie Wait, wykonując tick co 200 ms.
package main
import (
"fmt"
"time"
)
func main() {
tick := time.NewTicker(200 * time.Millisecond)
defer tick.Stop()
for i := 0; i < 4; i++ {
<-tick.C
fmt.Println("processed event", i)
}
}Dostosowywanie w czasie działania
Limity można zmieniać w czasie działania za pomocą SetLimit i SetBurst. Jest to przydatne, gdy przeładowanie konfiguracji lub odpowiedź 429 z usługi nadrzędnej informuje, że należy zwolnić tempo.
limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)Limity dla poszczególnych klientów
Należy przechowywać mapę, która przypisuje klucz klienta do *rate.Limiter, i chronić ją za pomocą mutexu. Przy pierwszym żądaniu z danym kluczem należy utworzyć limiter, a następnie używać go ponownie przy kolejnych żądaniach.
func getLimiter(m map[string]*rate.Limiter, key string) *rate.Limiter {
if l, ok := m[key]; ok {
return l
}
l := rate.NewLimiter(rate.Limit(5), 10)
m[key] = l
return l
}Middleware HTTP
Należy opakować handlery tak, aby każde żądanie najpierw wywoływało Allow(). Jeśli zwróci ono false, należy odpowiedzieć kodem HTTP 429 Too Many Requests. Jest to standardowy sposób ograniczania liczby żądań po stronie serwera.
Szybkie sprawdzenie
Sprawdź swoją wiedzę o pakiecie rate.
Podsumowanie
Poznali Państwo pakiet golang.org/x/time/rate:
- NewLimiter(rate, burst) tworzy kubełek
- rate.Every konwertuje odstęp czasu na tempo
- Allow odrzuca żądanie, Wait reguluje tempo, a Reserve zwraca opóźnienie
- SetLimit i SetBurst dostrajają ustawienia w czasie działania programu
- Mapa klientów wraz z HTTP 429 na serwerach
Często zadawane pytania
Czy lekcja „golang.org/x/time/rate” jest bezpłatna?
Tak — pełny tekst „golang.org/x/time/rate” 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 „golang.org/x/time/rate”?
Używaj ogranicznika częstotliwości Ć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 2 z 4.
Ile czasu zajmuje lekcja „golang.org/x/time/rate”?
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