Backoff och återförsök
Försök igen med backoff
Backoff och återförsök är en gratis lektion i Go Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Go Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Go Academy innehåller totalt 4 lektioner.
Varför försöka igen
Övergående fel, tidsgränser, tappade anslutningar och kortvariga 503-fel lyckas ofta vid ett andra försök. Nya försök gör en instabil operation tillförlitlig utan att besvära anroparen.
Naiva nya försök är farliga
Om ni försöker igen omedelbart i en tät loop överbelastar ni en redan pressad tjänst och kan orsaka en storm av nya försök. Vi behöver fördröjningar mellan försöken, och fördröjningarna bör öka.
Exponentiell backoff
Exponentiell backoff fördubblar väntetiden efter varje fel: 100 ms, 200 ms, 400 ms, 800 ms. Det ger den underliggande tjänsten utrymme att återhämta sig.
delay := 100 * time.Millisecond
for attempt := 0; attempt < 5; attempt++ {
// try, on failure:
time.Sleep(delay)
delay *= 2
}Lägga till jitter
Om många klienter använder backoff i samma takt försöker de igen i samma ögonblick, vilket skapar en så kallad thundering herd. Jitter varierar varje fördröjning något slumpmässigt så att försöken sprids ut över tid.
jitter := time.Duration(rand.Int63n(int64(delay) / 2))
time.Sleep(delay + jitter)Begränsa fördröjningen
Exponentiell tillväxt blir snabbt mycket stor. Begränsa fördröjningen till ett maximum så att ni inte behöver vänta minuter mellan försöken.
if delay > 2*time.Second {
delay = 2 * time.Second
}Begränsa antalet försök
Begränsa alltid antalet försök. När gränsen har nåtts returnerar ni det senaste felet, så att anroparen kan avgöra vad som ska göras i stället för att försöka för evigt.
Försök bara igen med idempotent arbete
Det är säkert att försöka igen endast när operationen kan köras två gånger utan skada. En GET är idempotent, medan en icke-idempotent POST som debiterar ett kort inte bör köras igen utan eftertanke. Använd idempotensnycklar när det behövs.
En komplett backoff-körning
Programmet försöker igen med en funktion som misslyckas två gånger och sedan lyckas, och fördubblar fördröjningen varje gång. Det använder endast standardbiblioteket.
package main
import (
"errors"
"fmt"
"time"
)
func flaky(attempt int) error {
if attempt < 2 {
return errors.New("temporary failure")
}
return nil
}
func main() {
delay := 50 * time.Millisecond
var err error
for attempt := 0; attempt < 5; attempt++ {
err = flaky(attempt)
if err == nil {
fmt.Println("succeeded on attempt", attempt)
return
}
fmt.Printf("attempt %d failed, waiting %v\n", attempt, delay)
time.Sleep(delay)
delay *= 2
}
fmt.Println("gave up:", err)
}Respektera context
Skicka med en context i loopen för nya försök och välj på ctx.Done() medan ni väntar. Då kan en avbruten anropare eller en anropare vars tidsgräns har löpt ut omedelbart stoppa nya försök.
select {
case <-ctx.Done():
return ctx.Err()
case <-time.After(delay):
}Skilja på fel
Alla fel går inte att försöka igen med. En 400 Bad Request kommer att misslyckas varje gång. Inspektera felet eller statuskoden och försök bara igen vid övergående feltyper som tidsgränser, 429 och 5xx.
Circuit breakers
När felen kvarstår slutar en circuit breaker att skicka begäranden under en nedkylningsperiod i stället för att försöka igen vid varje anrop. Den kompletterar backoff genom att skydda mot ett beroende som tydligt ligger nere.
Snabbtest
Testa era kunskaper om backoff.
Sammanfattning
Ni har lärt er backoff och nya försök:
- Exponentiell backoff fördubblar fördröjningen efter varje fel
- Jitter förhindrar synkroniserade stormar av nya försök
- Begränsa fördröjningen och antalet försök
- Försök bara igen med idempotenta operationer eller återförsökbara fel
- Respektera context vid avbrytning
Lär dig Go med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Backoff och återförsök” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Go Academy, inklusive ”Backoff och återförsök”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Go Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Backoff och återförsök”?
Försök igen med backoff Ni övar på Go Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Go Academy?
Du behöver inga förkunskaper. Utbildningen i Go Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Backoff och återförsök”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Go Academy-lektionen?
Ja. Varje Go Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Token bucket-konceptet
- golang.org/x/time/rate
- Strypa goroutines
- Backoff och återförsök