Graceful Shutdown
Penjelasan
Mematikan server LANGSUNG (mis. Ctrl+C) bisa memutus request yang SEDANG DIPROSES di tengah jalan — graceful shutdown menangkap sinyal terminasi OS, memberi waktu server menyelesaikan request yang sedang berjalan (dengan batas waktu/timeout) sebelum benar-benar mati, dipakai lewat e.Shutdown(ctx).
Contoh Konsep
go func() {
if err := e.Start(":8080"); err != nil && err != http.ErrServerClosed {
e.Logger.Fatal("Server berhenti: ", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt)
<-quit // tunggu sinyal Ctrl+C atau terminasi lain
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := e.Shutdown(ctx); err != nil {
e.Logger.Fatal(err)
}
Praktikum
Jelaskan (sebagai catatan) apa yang terjadi kalau server Echo dimatikan TANPA graceful shutdown saat sedang memproses 100 request bersamaan, dibandingkan kalau memakai graceful shutdown dengan timeout 10 detik.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
e.Start() bersifat BLOCKING (tidak pernah return selama server jalan normal) — makanya WAJIB dijalankan di goroutine terpisah (go func() { ... }()) supaya kode setelahnya (menunggu sinyal shutdown) tetap bisa dieksekusi di goroutine utama.