Go Academy · Lekcja

Obsługa błędów i logika ponawiania

Sprawdzanie kodów statusu i implementowanie ponawiania prób

Lekcja 4 z 413 kroki

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.Millisecond

Nagłó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
Bezpłatny start

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

  1. Wykonywanie żądań HTTP
  2. Ustawianie limitów czasu i nagłówków
  3. Dekodowanie odpowiedzi JSON
  4. Obsługa błędów i logika ponawiania
← Powrót do Go Academy