Obsługa błędów i logika ponawiania
Sprawdzanie kodów statusu i implementowanie ponawiania prób
Obsługa błędów i logika ponawiania to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 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.
Błędy HTTP nie są błędami Go
Status HTTP 404 lub 500 nie jest błędem Go — http.Client.Do zwraca błąd nil dla każdej prawidłowej odpowiedzi HTTP. Jawnie sprawdzaj resp.StatusCode.
Opakowywanie błędów
Opakowuj błędy wraz z kontekstem za pomocą fmt.Errorf("operation: %w", err), aby wywołujący mógł sprawdzić przyczynę za pomocą errors.Is / errors.As.
if err != nil {
return fmt.Errorf("fetch users: %w", err)
}Błędy powtarzalne i niepowtarzalne
Ponawiaj próbę w przypadku: limitów czasu sieci, 429 Too Many Requests i 503 Service Unavailable. Nie ponawiaj jej w przypadku: 400 Bad Request, 401 Unauthorized i 404 Not Found — ponowienie nie pomoże.
Wykładniczy back-off
Wydłużaj czas oczekiwania między kolejnymi próbami, aby zmniejszyć obciążenie przeciążonego serwera. Prosta implementacja:
for i := 0; i < maxRetries; i++ {
resp, err := client.Do(req)
if err == nil && resp.StatusCode < 500 { break }
time.Sleep(time.Duration(math.Pow(2, float64(i))) * time.Second)
}Jitter
Dodaj losowy jitter do opóźnienia między próbami, aby zapobiec jednoczesnemu ponawianiu prób przez wielu klientów (efekt „stada” — thundering herd).
wait := time.Duration(math.Pow(2, float64(i)))*time.Second + time.Duration(rand.Intn(1000))*time.MillisecondNagłówek Retry-After
Odpowiedź 429 często zawiera nagłówek Retry-After. Odczytaj go i zastosuj zamiast stałego opóźnienia między próbami.
retryAfter := resp.Header.Get("Retry-After")
if secs, err := strconv.Atoi(retryAfter); err == nil {
time.Sleep(time.Duration(secs) * time.Second)
}Ponawianie prób z uwzględnieniem kontekstu
Przed każdą próbą sprawdzaj kontekst, aby przerwać ponawianie, jeśli żądanie zostało anulowane.
for i := 0; i < maxRetries; i++ {
if ctx.Err() != nil { return nil, ctx.Err() }
// attempt
}Niestandardowe typy błędów
Zdefiniuj typowane błędy HTTP przechowujące kod statusu i treść, aby wywołujący mógł podejmować bardziej szczegółowe decyzje dotyczące ponawiania prób.
type HTTPError struct {
Status int
Body string
}
func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.Status, e.Body) }Opcje biblioteczne
Rozważ użycie hashicorp/go-retryablehttp lub cenkalti/backoff w logice ponawiania prób dla środowiska produkcyjnego. Biblioteki te obsługują konfigurowalne zasady opóźnień, maksymalną liczbę prób i kontekst.
Klucze idempotencji
W przypadku ponawianych żądań POST dołącz do nagłówka klucz idempotencji (UUID), aby serwer usuwał duplikaty prób i zwracał ten sam wynik bez tworzenia zduplikowanych zasobów.
Wyłącznik awaryjny
Wyłącznik awaryjny śledzi częstotliwość błędów i przez określony czas schładzania wstrzymuje wysyłanie żądań do usługi, która ulega awariom. Biblioteki takie jak sony/gobreaker implementują ten wzorzec.
Szybkie sprawdzenie
Dlaczego do wykładniczego back-off należy dodać jitter?
Podsumowanie: obsługa błędów i ponawianie prób
Najważniejsze informacje:
- Sprawdzaj resp.StatusCode — błędy HTTP nie są błędami Go
- Ponawiaj próbę w przypadku 429, 503 i limitów czasu sieci; nie rób tego w przypadku błędów klienta 4xx
- Wykładniczy back-off wraz z jitterem zapobiega efektowi „stada” (thundering herd)
- Zawsze sprawdzaj kontekst przed ponowieniem próby
Ucz się Go dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 51
- Lekcje
- 203
Często zadawane pytania
Czy lekcja „Obsługa błędów i logika ponawiania” jest bezpłatna?
Tak — pełny tekst „Obsługa błędów i logika ponawiania” 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 „Obsługa błędów i logika ponawiania”?
Sprawdzanie kodów statusu i implementowanie ponawiania prób Ć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 4 z 4.
Ile czasu zajmuje lekcja „Obsługa błędów i logika ponawiania”?
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
- Wykonywanie żądań HTTP
- Ustawianie limitów czasu i nagłówków
- Dekodowanie odpowiedzi JSON
- Obsługa błędów i logika ponawiania