Gracefully Shutdown Golang

Halo teman teman perkenalkan nama saya ariadi ahmad. kali ini saya akan share tentang gracefully shutdow in golang. oke lansung aja yaa.

Yang Ingin Membantu Saya Untuk Terus Berkontribusi Boleh Banget Klik Dibawah

Apa Itu Gracefull Shutdown?

Gracefull shutdown sendiri adalah sebuah mekanisme dalam menutup koneksi dengan cara yang aman dan tepat. misalkan kalian punya sebuah permintaan untuk melakukan transfer uang dan tiba2 aplikasi di matikan di saat itu. apa yang terjadi. pasti berbahaya kan. maka disitulah gracefull shutdown hadir.

Implementasi Di Golang Not Gracefull

Buat sebuah folder di project golang kalian dengan nama server_not. buat sebuah file bernama server_not.go. kita akan mencoba melihat apa yang terjadi jika tidak menggunakan server not gracefull.

Di root main kalian bisa menuliskan code berikut

Yang Terjadi Seperti Ini

Proses berhenti di tengah jalan dan transfer uang sudah di lakukan.

Kita akan coba dengan gracefull shutdown

dengan membuat sebuah folder dengan nama server dan didalamnya ada sebuah file bernama server.go

  • Apa yang dilakukan di atas adalah. kita menggunnakan goroutine untuk menjalankan servernya

server := http.Server{  
Addr:    "0.0.0.0:8080",  
Handler: router
}
serverErr := make(chan error, 1) 
go func() {  
log.Println("server listening on", server.Addr) 
 serverErr <- server.ListenAndServe() }
 ()
  • kita membuat chanel untuk mendengarkan signal yang terjadi

shutdownChannel := make(chan os.Signal, 1)
signal.Notify(shutdownChannel, syscall.SIGINT)
  • Kita melakukan select untuk melihat signal apa yang terjadi. jika chanel menerima signal shutdown atau interupt kita melakukan gracefull shutdown selama 10 detik untuk menunggu process diselesaikan dengan baik.

select { case sig := <-shutdownChannel: 
 log.Println("signal:", sig)
 const timeout = 10 * time.Second  
 ctx, cancel := context.WithTimeout(context.Background(), timeout) 
  defer cancel()
 if err := server.Shutdown(ctx); 
 err != nil {   server.Close()  
 } 
 case err := <-serverErr:  
 if err != nil {   log.Fatalf("server: %v", err)  
 } 
 }

Kita lihat hasilnya

lihat kita mencoba melakukan ctrl c atau interupt ditengah request. dan berhasil menyelesaikan request dengan baik. Note : kenapa angakanya gak muncul karena saya salah memasukkan data parameter get HEADER

X-REQUEST-MONEY

Yang Ingin Membantu Saya Untuk Terus Berkontribusi Boleh Banget Klik Dibawah

itulah sedikit sharingnya semoga membantu teman teman.

Last updated