Graceful shutdown?

김정빈·2021년 4월 12일
0

common sense

목록 보기
1/1

의의

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.."을 출력하면서 프로그램을 종료한다.

결과

profile
백엔드 개발자가 되고 싶은 학생입니다

0개의 댓글