본문 바로가기

Programming/Infra

Graceful Shutdown (with nginx & spring boot)

Graceful Shutdown ?

정확한 개념에 대해서는 말들이 많지만, 간단히 말해서 현재 들어온 요청을 모두 수행하고 우아하게(?) 종료된다는 개념이다.

예를 들어, 내가 어떠한 상품을 구매하기 위해 결제 요청을 했고, 서버가 결제를 처리하고 있는데, 뭔지 모르는 이유로 서버가 종료될 때 이미 처리하고 있는 결제 요청은 모두 처리하고 종료된다는 것을 의미한다.

 

Graceful Shutdown을 이해하기 위해서는 SIGTERM, SIGKILL에 대한 이해도 필요하다.

SIGTERM과 SIGKILL의 이해를 돕기 위한 유명한 그림이 있다.

SIGTERM은 위 그림처럼 자식에게 가기 전에 인사할 시간을 준다. 쉽게 말해, 서버에게 종료될 시간을 주는 것이다. 

SIGKILL은 위 그림처럼 인사할 시간도 안준다. 쉽게 말해, 강제로 서버를 죽여버린다.

 

더욱 이해하기 쉽게 IntelliJ에서 Spring Boot을 띄웠다고 생각했을 때, 정지 버튼을 한번 누를 땐 SIGTERM, 두번 눌러서 강제로 꺼버리는건 SIGKILL이라고 생각하면 된다.

 

이러한 Graceful Shutdown을 구현하기 위해서는 애플리케이션마다 제공하는 방법이 다르다.

내가 주로 이용하는 환경은 Nginx (또는 Apache)와 Spring boot 이므로 이를 중점으로 정리한다.

 

Nginx는 Graceful Shutdown을 다음과 같은 명령어를 사용한다.

nginx -s quit

nginx -s stop은 즉시 종료

 

Spring Boot는 자동으로 Graceful Shutdown을 지원하지 않는다.

Spring Boot는 2.3.0 이상의 버전에서는 properties 설정으로 간단하게 구현이 가능하다. 

(2.3.0 이하 버전은 설명이 길어지므로 생략한다.)

server.shutdown=graceful

 

 

참고링크

- https://dzone.com/articles/the-real-reason-to-not-use-sigkill-comic