0Pricing
Go Academy · Lektion

Graceful Shutdown

Betriebssystems signale verarbeiten und Verbindungen ordnungsgemäß abarbeiten

Graceful Shutdown 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 kontrolliertes Herunterfahren?

Der Aufruf von os.Exit oder das einfache Beenden des Servers verwirft alle laufenden Anfragen. Beim kontrollierten Herunterfahren wartet der Server, bis aktive Anfragen abgeschlossen sind, bevor er beendet wird.

http.Server.Shutdown

srv.Shutdown(ctx) nimmt keine neuen Verbindungen mehr an, wartet, bis aktive Anfragen beendet sind, und kehrt dann zurück. Übergeben Sie einen Context mit einer Deadline, um die Wartezeit zu begrenzen.

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)

Signalbehandlung

Warten Sie in einer Goroutine auf SIGINT/SIGTERM und rufen Sie bei dessen Empfang Shutdown auf:

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("shutting down...")
srv.Shutdown(ctx)

Vollständiges Muster für kontrolliertes Herunterfahren

Starten Sie den Server in einer Goroutine, warten Sie auf dem Signal-Channel und fahren Sie ihn anschließend herunter:

go func() {
    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        log.Fatal(err)
    }
}()

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
srv.Shutdown(ctx)

http.ErrServerClosed

Nachdem Shutdown aufgerufen wurde, gibt ListenAndServe http.ErrServerClosed zurück. Behandeln Sie dies als normales Beenden, nicht als Fehler.

Verbindungen auslaufen lassen

Shutdown wartet nur dann auf alle übernommenen Verbindungen und aktiven WebSocket-Verbindungen, wenn der Handler selbst den Abbruch des Kontexts berücksichtigt. Long-Polling- oder Streaming-Handler müssen r.Context().Done() prüfen.

Zeitlimit für das Herunterfahren

Setzen Sie ein angemessenes Zeitlimit für das Herunterfahren (10–30 s). Wenn nach Ablauf der Deadline noch Anfragen ausgeführt werden, gibt Shutdown context.DeadlineExceeded zurück und die verbleibenden Verbindungen werden zwangsweise geschlossen.

Aufräumen beim Herunterfahren

Schließen Sie nach der Rückkehr von Shutdown Datenbank-Pools, leeren Sie Log-Puffer und geben Sie andere Ressourcen geordnet frei. Verwenden Sie defer oder eine explizite Reihenfolge.

srv.Shutdown(ctx)
db.Close()
logger.Sync()

Server.Close und Server.Shutdown

srv.Close() schließt alle Verbindungen sofort, ohne zu warten. Verwenden Sie es nur, wenn ein erzwungenes Beenden akzeptabel ist, beispielsweise in Tests.

Kubernetes-Readiness-Probe

Aktualisieren Sie während des Herunterfahrens die Readiness-Probe so, dass sie vor dem Aufruf von Shutdown 503 zurückgibt. Dadurch wird dem Load-Balancer signalisiert, keine neuen Anfragen mehr an den Pod weiterzuleiten.

Mehrere Server

Wenn mehrere Server ausgeführt werden (HTTP + gRPC + Metriken), fahren Sie jeden Server gleichzeitig in Goroutines herunter und verwenden Sie eine WaitGroup, um auf das Auslaufen aller Server zu warten.

Kurzer Test

Was bewirkt http.Server.Shutdown?

Zusammenfassung: Kontrolliertes Herunterfahren

Wichtige Punkte:

  • srv.Shutdown(ctx) stoppt neue Verbindungen und wartet auf aktive Verbindungen
  • Mit signal.Notify auf SIGINT/SIGTERM warten
  • ListenAndServe gibt beim Herunterfahren http.ErrServerClosed zurück – das ist kein Fehler
  • Eine Deadline für das Herunterfahren setzen, damit nicht unbegrenzt gewartet wird

Häufig gestellte Fragen

Ist die Lektion „Graceful Shutdown“ kostenlos?

Ja — der vollständige Text von „Graceful Shutdown“ 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 „Graceful Shutdown“?

Betriebssystems signale verarbeiten und Verbindungen ordnungsgemäß abarbeiten 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 „Graceful Shutdown“?

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

  1. Einen HTTP-Server erstellen
  2. Routing und Pfadparameter
  3. Middleware-Pattern
  4. Graceful Shutdown
← Zurück zu Go Academy