Backoff und Wiederholung
Mit Backoff erneut versuchen
Backoff und Wiederholung ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Wiederholungen
Vorübergehende Fehler, Timeouts, unterbrochene Verbindungen und kurze 503-Fehler funktionieren bei einem zweiten Versuch oft. Wiederholungen machen aus einer unzuverlässigen Operation eine zuverlässige, ohne den Aufrufer zu belasten.
Naive Wiederholungen sind gefährlich
Wenn Sie in einer engen Schleife sofort wiederholen, belasten Sie einen bereits überforderten Dienst zusätzlich und können eine Wiederholungswelle auslösen. Wir benötigen Pausen zwischen den Versuchen, und diese Pausen sollten länger werden.
Exponentieller Backoff
Exponentieller Backoff verdoppelt die Wartezeit nach jedem Fehler: 100ms, 200ms, 400ms, 800ms. Dadurch erhält der nachgelagerte Dienst Zeit, sich zu erholen.
delay := 100 * time.Millisecond
for attempt := 0; attempt < 5; attempt++ {
// try, on failure:
time.Sleep(delay)
delay *= 2
}Jitter hinzufügen
Wenn viele Clients im Gleichschritt warten, wiederholen sie den Versuch im selben Moment – es entsteht eine Herde. Jitter verändert jede Verzögerung leicht zufällig, sodass sich die Wiederholungen zeitlich verteilen.
jitter := time.Duration(rand.Int63n(int64(delay) / 2))
time.Sleep(delay + jitter)Die Verzögerung begrenzen
Exponentielles Wachstum erreicht schnell sehr große Werte. Begrenzen Sie die Verzögerung auf ein Maximum, damit Sie nicht mehrere Minuten zwischen den Versuchen warten.
if delay > 2*time.Second {
delay = 2 * time.Second
}Die Anzahl der Versuche begrenzen
Begrenzen Sie immer die Anzahl der Versuche. Nach Erreichen des Limits geben Sie den letzten Fehler zurück, damit der Aufrufer entscheiden kann, was stattdessen geschehen soll, anstatt endlos zu wiederholen.
Nur idempotente Vorgänge wiederholen
Wiederholungen sind nur dann sicher, wenn die Operation zweimal ohne Schaden ausgeführt werden kann. Ein GET ist idempotent; ein nicht idempotenter POST, der eine Karte belastet, sollte nicht blind wiederholt werden. Verwenden Sie bei Bedarf Idempotenzschlüssel.
Eine vollständige Backoff-Wiederholung
Dieses Programm wiederholt eine Funktion, die zweimal fehlschlägt und anschließend erfolgreich ist, und verdoppelt dabei jedes Mal die Verzögerung. Es verwendet ausschließlich die Standardbibliothek.
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)
}Context berücksichtigen
Übergeben Sie einen context an die Wiederholungsschleife und verwenden Sie beim Warten eine Auswahl über ctx.Done(). So kann ein abgebrochener oder zeitlich begrenzter Aufrufer die Wiederholungen sofort beenden.
select {
case <-ctx.Done():
return ctx.Err()
case <-time.After(delay):
}Fehler unterscheiden
Nicht jeder Fehler kann wiederholt werden. Eine 400 Bad Request wird dauerhaft fehlschlagen. Untersuchen Sie den Fehler oder Statuscode und wiederholen Sie nur bei vorübergehenden Fehlerklassen wie Timeouts, 429 und 5xx.
Circuit Breaker
Wenn Fehler dauerhaft auftreten, verhindert ein Circuit Breaker während einer Abkühlphase das Senden weiterer Requests, anstatt jeden Aufruf zu wiederholen. Er ergänzt den Backoff, indem er eine eindeutig ausgefallene Abhängigkeit schützt.
Kurztest
Testen Sie Ihr Wissen über Backoff.
Zusammenfassung
Sie haben Backoff und Wiederholungen gelernt:
- Exponentieller Backoff verdoppelt die Verzögerung nach jedem Fehler
- Jitter verhindert synchronisierte Wiederholungswellen
- Begrenzen Sie die Verzögerung und die Anzahl der Versuche
- Wiederholen Sie nur bei idempotenten Vorgängen oder wiederholbaren Fehlern
- Berücksichtigen Sie den Context für Abbrüche
Lerne Go mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Backoff und Wiederholung“ kostenlos?
Ja — der vollständige Text von „Backoff und Wiederholung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Backoff und Wiederholung“?
Mit Backoff erneut versuchen Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Backoff und Wiederholung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das Token-Bucket-Konzept
- golang.org/x/time/rate
- Goroutines drosseln
- Backoff und Wiederholung