Fejlhåndtering og retry-logik
Kontrol af statuskoder og implementering af retries
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.MillisecondRetry-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
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
- Afsendelse af HTTP-requests
- Indstilling af timeouts og headers
- Afkodning af JSON-responses
- Fejlhåndtering og retry-logik