배포를 공부하다가 처음 알게 된 기술이 있어 공부 후 정리하는 글이다.
내가 이번에 처음 알게 된 기술은 Graceful Shutdown
이라는 기술인데, 해당 기술에 대해 짤막하게 정리하면 아래와 같다.
Graceful Shutdown
Graceful Shutdown
은 서버가 종료 작업을 시작을 했다면 새로운 요청의 수신은 모두 거절하고 기존 처리하던 요청을 설정된 시간 안에 처리 할 수 있으면 처리 후 서버를 안정적으로 종료하는 기술이다.
실습
환경
Spring Boot 3.3.5
Spring Boot 2.3.0
버전 부터 Graceful Shutdown을 단순 application.yml
설정으로 간단하게 사용 할 수 있게 제공 해주며, 현재는 Jetty, Reactor Netty, Tomcat, Undertow 내장형 4개의 웹 어플리케이션 서버 및 reactive and servlet-based web applications에서도 Graceful 방식의 Shutdown 기능을 제공한다.
Graceful Shutdown 테스트를 위해 첫 실습에서는 설정을 하지 않고 진행하였고,
두번째 실습에서는 Graceful Shutdown 설정을 하여 진행하였으며 실습 시나리오는아래와 같다.
package com.example.gracefulshutdowntest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class GracefulController {
@PostMapping ("/graceful")
public String graceful(@RequestBody GracefulRequest request) {
log.info("start processing request {}", request.getSequence());
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
log.error("error processing request {}", request.getSequence(), e);
}
log.info("end processing request {}", request.getSequence());
return "graceful";
}
}
먼저 실험을 위해 요청이 들어오면 15초 후 응답을 주는 코드를 구현하였다.
그 다음 실습을 위해 적절한 간격을 주어 3개의 요청을 보냈는데, 1, 2번째 요청은 Server가 Running 상태일 때 전송 하였고 3번 요청은 서버가 종료 작업을 시작 한 후 전송하였다.
이 중 2번째 요청을 전송하자마자 서버에게 종료 작업을 요청하였으며 작업이 끝나기전에 서버가 종료 될 것이다.
Graceful Shutdown 적용 전
기본적으로 Spring Boot는 Graceful 설정을 하지 않았다면 기존에 작업 중인 요청을 무시하고 서비스를 강제로 종료 한다는 것을 아래 사진을 통해 알 수 있다.
Graceful Shutdown 적용 후
적용법
application
설정파일에 아래와 같이 입력해주면 된다.
spring:
lifecycle:
timeout-per-shutdown-phase: 20s # 작업의 timeout 설정
server:
shutdown: graceful # shutdown
Graceful Shutdown을 설정 후 서비스가 종료하면 요청중인 작업을 설정 시간 내 처리 할 수 있다면 요청을 처리 후 종료 한다는걸 볼 수 있다.
주의 사항
-15(SIGTERM)
Signal을 이용해 종료시 Graceful Shutdown을 진행하고-9(SIGKILL)
Signal을 통해 강제로 종료하게된다면 graceful 설정을 하여도 정상적으로 작동하지 않는다.spring.lifecycle.timeout-per-shutdown-phase
값을 너무 길게 설정하면 지연으로 인해 CD과정에서 배포 과정이 길어질 수 있다.
실습 프로젝트
https://github.com/dobidugi/spring-boot-graceful-shutdown
참고 자료
https://docs.spring.io/spring-boot/reference/web/graceful-shutdown.html
'배포' 카테고리의 다른 글
CI/CD 도구 선정하기 (1) | 2023.12.08 |
---|