Graceful Shutdown: Sunucuyu Güvenli Kapatmanın Yolu

Sunucuyu aniden kapatmak devam eden işlemleri kesintiye uğratır, veritabanı bağlantılarını açık bırakır, istemcileri cevapsız bırakır. Graceful shutdown bu sorunları önler: sunucu yeni istekleri almayı durdurur, mevcut işlemlerin bitmesini bekler, sonra güvenli şekilde kapanır.

İlk adım, işletim sisteminden kapanış sinyalini (SIGTERM) yakalamasını sağlamaktır. Sunucu bu sinyali alınca yeni bağlantıları reddetmeye başlar. İkinci adım, halihazırda devam eden isteklerin tamamlanmasını beklemektir, zaman sınırı koyup çok uzun süren işleri sonlandırmak gerekir. Üçüncü adım, veritabanı bağlantılarını, dosya tutamaçlarını ve diğer kaynakları serbest bırakmaktır.

Pratik örnek olarak Go dilinde bir HTTP sunucusu yazalım:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1package main
2
3import (
4"context"
5"fmt"
6"log"
7"net/http"
8"os"
9"os/signal"
10"syscall"
11"time"
12)
13
14func main() {
15mux:= http.NewServeMux()
16mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
17time.Sleep(2 * time.Second) // İşlem simülasyonu
18fmt.Fprintf(w, "Merhaba")
19})
20
21server:= &http.Server{
22Addr: ":8080",
23Handler: mux,
24}
25
26// Kapanış sinyalini dinle
27sigChan:= make(chan os.Signal, 1)
28signal.Notify(sigChan, syscall.SIGTERM, os.Interrupt)
29
30go func() {
31<-sigChan
32log.Println("Kapanış başlıyor...")
33
34// Yeni istekleri reddet, mevcut isteklerin bitmesini bekle (max 10 saniye)
35ctx, cancel:= context.WithTimeout(context.Background(), 10*time.Second)
36defer cancel()
37
38if err:= server.Shutdown(ctx); err!= nil {
39log.Println("Kapanış hatası:", err)
40}
41}()
42
43log.Println("Sunucu başladı::8080")
44if err:= server.ListenAndServe(); err!= nil && err!= http.ErrServerClosed {
45log.Fatal(err)
46}
47
48log.Println("Sunucu kapatıldı")
49}

Bu kodda server.Shutdown() fonksiyonu graceful kapanışı yönetir. Sunucuya SIGTERM sinyali gönderilirse (örneğin terminalde Ctrl+C ya da konteyner durdurulursa), mevcut istekler 10 saniye içinde tamamlanır, sonra sunucu kapanır. Zaman aşımından sonra kalan işlemler zorla sonlandırılır.

Gerçek ortamda, özellikle Kubernetes gibi konteyner platformlarında, graceful shutdown hayati önem taşır. Pod silinirken veri kaybı ya da istemci hataları yaşanmaz.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz