관리 메뉴

피터의 개발이야기

[SpringBoot] SpringBoot에 Graceful Shutdown 적용하기 본문

Programming/Spring

[SpringBoot] SpringBoot에 Graceful Shutdown 적용하기

기록하는 백앤드개발자 2022. 6. 27. 00:16
반응형

 

ㅁ 개요

 ㅇ Kubernetes환경에서 시스템을 운영하면서 트래픽에 따라 수시로 scale In/Out된다.

 ㅇ 이런 과정에서 pod가 종료되는 시점에 502 에러가 발생하여 이를 해결하기 위해 고민하게 되었다.

 ㅇ [Kubernetes] Kubernetes환경에서 graceful shutdown이란 글을 작성하였고, 

      이 글에서는 graceful shutdown을 적용하는 방법에 대해서 정리하였다.

 

 

ㅁ SpringBoot에서 graceful Shutdown이란

  graceful Shutdown이란 할건 하고 종료하자이다.

 

 

  graceful shutdown은 SpringBoot 어플리케이션 서버 종료 시 webserver를 우선 종료시켜 새로운 요청을 받지 않고, 처리 중인 요청을 완료한 후에 종료하는 것이다. 4개의 내장 웹 서버(Jetty, Reactor Netty, Tomcat, Undertow)와 반응형 및 서블릿 기반 웹 응용 프로그램 모두에서 graceful Shutdown이 지원된다. 다르게 말하면, 서블릿 기반 MVC와 reactive stream 기반 webflux에서도 동작한다. 이는 어플리케이션을 닫는 과정의 가장 초기 단계에서 수행된다. 이 중지 처리는 기존 요청이 완료하도록 기다리지만 새 요청은 허용되지 않는 유예 기간을 제공한다.

  새 요청이 허용되지 않는 정확한 방법은 사용 중인 웹 서버에 따라 다르다. Jetty, Reactor NettyTomcat은 네트워크 계층에서 요청 수락을 중지한다. Undertow는 요청을 수락하지만 서비스를 사용할 수 없음(503) 응답으로 즉시 응답한다.

 

 

ㅁ application.properties

# graceful shutdown 설정
server.shutdown=graceful

# graceful shutdown 유예시간 설정
spring.lifecycle.timeout-per-shutdown-phase=20s

 ㅁ application.yml

server:
  shutdown: graceful
spring:
  lifecycle:
    timeout-per-shutdown-phase: 20s

 

ㅇ server.shutdown을 설정하지 않으면 기본이 IMMEDIATE이다.

ㅇ spring.lifecycle.timeout-per-shutdown-phase의 기본 설정은 30초이다.

ㅇ 기존 요청이 충분히 처리될 수 있는 시간을 설정하지 않는 경우, 기존 처리가 진행되는 과정에서 kill 처리가 되기 때문에 graceful shutdown 로직을 적용하기 전의 상황과 동일한 결과를 얻게 된다. 

 

 

ㅁ SmartLifecycle bean 처리 과정 소스 분석

ㅇ application 종료 초기 단계에서는  SmartLifecycle bean에서 stop이 된다.

 

 

 ㅇ 상속받은 stop이 호출된다.

 

 

 ㅇ 호출된 stop에서는 webServer가 중지 되면서 더 이상의 요청을 받지 않고 외부에서 연결할 수 없는 상태가 된다.

 

 

ㅁ 함께 보면 좋은 사이트

 

Spring Boot Features

Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest

docs.spring.io

 

GitHub - spring-projects/spring-boot: Spring Boot

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

Web Server Graceful Shutdown in Spring Boot | Baeldung

Learn how to take advantage of the new graceful shutdown feature in Spring Boot 2.3

www.baeldung.com

 

 

반응형
Comments