Graceful shutdown은 프로그램이 종료될 때 최대한 side effect를 내지 않기 위해 로직들을 잘 처리하고 종료하는 것을 의미한다.
만약 강제로 종료된다면, 데이터의 손실과 비즈니스 로직이 제대로 처리되지 않는 채로 종료될 수 있다.
따라서, Graceful shutdown
은 중요하다고 말할 수 있다.
요즘 자주 사용하고 있는 go언어의 gin 프레임워크를 통해서 구현해 보았다.
func main() {
r := gin.Default()
routes.Setup(r)
srv := &http.Server{
Addr: ":8080",
Handler: r,
}
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Server started listen: %s\n", err)
}
}()
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutdown server...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server shutdown: %v", err)
}
select {
case <-ctx.Done():
log.Println("Timeout of 5 seconds.")
}
log.Println("Server exiting..")
}
위 코드에서 os.Signal
을 이용하여 프로그램 종료 신호를 기다린다.
signal.Notify
를 통해 SIGINT 메시지를 받으면 "Server exiting.."을 출력하면서 프로그램을 종료한다.