일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AWS EKS
- Kubernetes
- mysql 튜닝
- 정보처리기사 실기
- 정보처리기사실기 기출문제
- 코틀린 코루틴의 정석
- kotlin spring
- AI
- MySQL
- kotlin coroutine
- CloudWatch
- Pinpoint
- Linux
- CKA
- Elasticsearch
- APM
- minikube
- Spring
- 오블완
- kotlin
- IntelliJ
- 기록으로 실력을 쌓자
- CKA 기출문제
- kotlin querydsl
- Java
- aws
- 티스토리챌린지
- 공부
- 정보처리기사 실기 기출문제
- PETERICA
- Today
- Total
피터의 개발이야기
[SpringBoot] SpringBoot에 Graceful Shutdown 적용하기 본문
ㅁ 개요
ㅇ 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 Netty 및 Tomcat은 네트워크 계층에서 요청 수락을 중지한다. 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가 중지 되면서 더 이상의 요청을 받지 않고 외부에서 연결할 수 없는 상태가 된다.
ㅁ 함께 보면 좋은 사이트
'Programming > Spring' 카테고리의 다른 글
[Spring] 파일업로드 시 Invalid boundary error 처리 (0) | 2022.08.25 |
---|---|
[Spring] REST API - URI 디자인 가이드 (0) | 2022.08.23 |
[SpringBoot] SpringBoot-Tomcat GracefulShutdown 구현 (0) | 2022.06.26 |
Apache Log4j 보안이슈 대응 (0) | 2021.12.13 |
[Spring] DTO 깔끔하게 정리하는 법, Inner Class (0) | 2021.03.02 |