Go Academy · Lektion

Fejlhåndtering og retry-logik

Kontrol af statuskoder og implementering af retries

Lektion 4 af 413 trin

Fejlhåndtering og retry-logik er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.

HTTP-fejl er ikke Go-fejl

En HTTP-status på 404 eller 500 er ikke en Go-fejl — http.Client.Do returnerer nil som fejl for alle gyldige HTTP-svar. Kontrollér resp.StatusCode eksplicit.

Indpakning af fejl

Indpak fejl med kontekst ved hjælp af fmt.Errorf("operation: %w", err), så kaldere kan undersøge årsagen med errors.Is / errors.As.

if err != nil {
    return fmt.Errorf("fetch users: %w", err)
}

Fejl, der kan forsøges igen, og fejl, der ikke kan

Forsøg igen ved netværkstidsgrænser, 429 For mange forespørgsler og 503 Tjeneste utilgængelig. Forsøg ikke igen ved 400 Ugyldig forespørgsel, 401 Ikke godkendt eller 404 Ikke fundet — gentagelse hjælper ikke.

Eksponentiel ventetidsforøgelse

Vent længere mellem hvert forsøg for at reducere belastningen på en overbelastet server. En enkel implementering:

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)
}

Tilfældig variation

Tilføj en tilfældig variation til ventetiden for at forhindre flere klienter i at forsøge igen samtidig (samtidighedsstorm).

wait := time.Duration(math.Pow(2, float64(i)))*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond

Retry-After-header

Svaret 429 indeholder ofte en Retry-After-header. Fortolk den, og respekter den i stedet for at bruge en fast ventetid.

retryAfter := resp.Header.Get("Retry-After")
if secs, err := strconv.Atoi(retryAfter); err == nil {
    time.Sleep(time.Duration(secs) * time.Second)
}

Kontekstbevidste forsøg igen

Kontrollér konteksten før hvert nyt forsøg for at stoppe gentagelser, hvis forespørgslen blev annulleret.

for i := 0; i < maxRetries; i++ {
    if ctx.Err() != nil { return nil, ctx.Err() }
    // attempt
}

Brugerdefinerede fejltyper

Definér typede HTTP-fejl, der indeholder statuskoden og brødteksten, så kaldere kan træffe detaljerede beslutninger om, hvorvidt de skal forsøge igen.

type HTTPError struct {
    Status int
    Body   string
}
func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.Status, e.Body) }

Biblioteksindstillinger

Overvej hashicorp/go-retryablehttp eller cenkalti/backoff til logik for gentagne forsøg i produktion med konfigurerbare politikker for ventetid, maksimalt antal forsøg og understøttelse af kontekster.

Idempotensnøgler

Ved POST-forespørgsler, der gentages, skal du medtage en idempotensnøgle i en (UUID-)header, så serveren fjerner dubletter blandt forsøgene og returnerer det samme resultat uden at oprette dublerede ressourcer.

Kredsløbsafbryder

En kredsløbsafbryder holder styr på fejlprocenter og stopper med at sende forespørgsler til en fejlende tjeneste i en afkølingsperiode. Biblioteker som sony/gobreaker implementerer dette mønster.

Hurtig kontrol

Hvorfor bør du tilføje en tilfældig variation til den eksponentielle ventetidsforøgelse?

Opsummering: Fejlhåndtering og gentagne forsøg

Vigtige punkter:

  • Kontrollér resp.StatusCode — HTTP-fejl er ikke Go-fejl
  • Forsøg igen ved 429, 503 og netværkstidsgrænser, men ikke ved 4xx-klientfejl
  • Eksponentiel ventetidsforøgelse plus tilfældig variation forhindrer samtidighedsstorme
  • Kontrollér altid konteksten før et nyt forsøg
Gratis at komme i gang

Lær Go med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Fejlhåndtering og retry-logik” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Fejlhåndtering og retry-logik”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Fejlhåndtering og retry-logik”?

Kontrol af statuskoder og implementering af retries Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Go Academy?

Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Fejlhåndtering og retry-logik”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Go Academy-lektion?

Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Afsendelse af HTTP-requests
  2. Indstilling af timeouts og headers
  3. Afkodning af JSON-responses
  4. Fejlhåndtering og retry-logik
← Tilbage til Go Academy