반응형
As of Spring Boot 2.3, Spring Boot now supports the graceful shutdown feature for all four embedded web servers (Tomcat, Jetty, Undertow, and Netty) on both servlet and reactive platforms.

springboot 2.1.8을 상용화 버전으로 사용할 때에는 graceful shutdown을 사용하기 위해서 TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> 를 구현하여 어플리케이션이 종료 시 이벤트를 설정했어야 했는데,

springboot 2.3이후 버전에서는 기본으로 탑재되어 application.properties에 아래 설정만으로도 graceful shutdown 이 가능해졌다.

server.shutdown=graceful     //default: immediate
spring.lifecycle.timeout-per-shutdown-phase=30s      //default: 30s

 

graceful shutdown?

  • 어플리케이션 종료 시 사용하던 자원을 반납하고 현재 처리 중인 작업을 정리하는 과정
  • 어플리케이션 종료 요청을 받았을 시 바로 종료하지 않고, 신규 유입은 받지 않으면서 특정 시간을 기다려 처리 중인 작업이 마무리 되기를 기다림
  • 지정된 시간이 지나도록 작업이 마무리 되지 않는다면 그 때 강제 종료

graceful process

Q1. /actuator/shutdown으로 종료해야만 graceful이 작동하는가?

Q2. kill -9 로 프로세스를 종료시킬때에도 graceful한가?

Q3. kill -15일 경우에는?

 

A. /actuator/shutdown & kill -15 로 프로세스를 킬 할 경우 아래와 같은 로그가 지나가면서 graceful이 적용된 것을 알 수 있다.

11:09:07 INFO  [c.n.g.controller.TestController         .sleeeeeep           :  30] start sleep for 10 secs
11:09:11 INFO  [o.s.b.w.e.tomcat.GracefulShutdown       .shutDownGracefully  :  53] Commencing graceful shutdown. Waiting for active requests to complete
11:09:17 INFO  [c.n.g.controller.TestController         .sleeeeeep           :  32] sleep done
11:09:17 INFO  [o.s.b.w.e.tomcat.GracefulShutdown       .doShutdown          :  78] Graceful shutdown complete

허나 kill -9로 킬하면 graceful이 적용되지 않고 바로 종료된다.

INFO  [c.n.g.controller.TestController         .sleeeeeep           :  30] start sleep for 10 secs

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

 

공식적인 종료(배포 등)를 할 경우 kill -9를 사용하지 않고 actuator나 kill -15를 사용하여 진행 중인 작업이 안전하게 종료되도록 해야한다. 다만, 이 때 graceful time 이후에 health를 날려 잘 죽었는지 확인 후 재시작을 하도록 해야지 아니면 프로세스가 두 개 뜰 수 있으니 주의해아 한다.

728x90
반응형

+ Recent posts