0Pricing
Go Academy · Lekcja

Kontrolowane zamykanie

Obsługa sygnałów systemu operacyjnego i opróżnianie połączeń

Kontrolowane zamykanie to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Po co kontrolowane zamykanie?

Wywołanie os.Exit albo zwykłe zatrzymanie serwera powoduje utratę wszystkich żądań będących w toku. Kontrolowane zamykanie czeka na zakończenie aktywnych żądań przed wyjściem.

http.Server.Shutdown

srv.Shutdown(ctx) przestaje akceptować nowe połączenia, czeka na zakończenie aktywnych żądań, a następnie zwraca wynik. Przekaż kontekst z terminem, aby ograniczyć czas oczekiwania.

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

Obsługa sygnałów

Nasłuchuj SIGINT/SIGTERM w goroutine i po ich odebraniu wywołaj Shutdown:

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

Pełny wzorzec kontrolowanego zamykania

Uruchom serwer w goroutine, zablokuj wykonanie na kanale sygnałów, a następnie zamknij serwer:

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

Po wywołaniu Shutdown funkcja ListenAndServe zwraca http.ErrServerClosed. Traktuj to jako normalne zakończenie, a nie błąd.

Opróżnianie połączeń

Shutdown czeka na wszystkie przejęte połączenia oraz aktywne połączenia WebSocket tylko wtedy, gdy sam handler respektuje anulowanie kontekstu. Handlery long-pollingu lub strumieniowania muszą sprawdzać r.Context().Done().

Limit czasu zamykania

Ustaw rozsądny limit czasu zamykania (10–30 s). Jeśli po upływie terminu żądania nadal będą wykonywane, Shutdown zwróci context.DeadlineExceeded, a pozostałe połączenia zostaną wymuszenie zamknięte.

Sprzątanie podczas zamykania

Po zwróceniu wyniku przez Shutdown zamknij pule połączeń z bazą danych, opróżnij bufory logów i zwolnij pozostałe zasoby w odpowiedniej kolejności. Użyj defer albo jawnego ustalenia kolejności operacji.

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

Server.Close a Server.Shutdown

srv.Close() natychmiast zamyka wszystkie połączenia bez oczekiwania. Używaj go tylko wtedy, gdy wymuszone zatrzymanie jest akceptowalne, na przykład w testach.

Sonda gotowości Kubernetes

Podczas zamykania zmień sondę gotowości tak, aby zwracała 503, zanim wywołasz Shutdown. Sygnalizuje to load balancerowi, aby przestał kierować nowe żądania do poda.

Wiele serwerów

Jeśli uruchamiasz wiele serwerów (HTTP + gRPC + metryki), zamykaj je współbieżnie za pomocą goroutines i użyj WaitGroup, aby zaczekać na opróżnienie wszystkich.

Szybkie sprawdzenie

Co robi http.Server.Shutdown?

Podsumowanie: kontrolowane zamykanie

Najważniejsze informacje:

  • srv.Shutdown(ctx) zatrzymuje nowe połączenia i czeka na zakończenie aktywnych
  • Nasłuchuj SIGINT/SIGTERM za pomocą signal.Notify
  • ListenAndServe podczas zamykania zwraca http.ErrServerClosed — nie jest to błąd
  • Ustaw termin zamykania, aby uniknąć oczekiwania w nieskończoność

Często zadawane pytania

Czy lekcja „Kontrolowane zamykanie” jest bezpłatna?

Tak — pełny tekst „Kontrolowane zamykanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Kontrolowane zamykanie”?

Obsługa sygnałów systemu operacyjnego i opróżnianie połączeń Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Kontrolowane zamykanie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie serwera HTTP
  2. Routing i parametry ścieżek
  3. Wzorzec middleware
  4. Kontrolowane zamykanie
← Powrót do Go Academy