반응형
문제
CI/CD를 구성하면서, CD 마지막 과정은 EC2 서버의 기존 도커 컴포즈를 down 하고 다시 up 하는 과정이 있다. 그리고 재시작하면서 스프링 컨테이너를 강제 종료하는데, 이때 진행 중인 로직도 그대로 강제 종료되는 문제가 있었다.
예를 들어, 주문 처리 중 재고는 감소시켰는데 강제 종료가 되어서 재고가 롤백되지 않는 문제가 있을 수 있다. (MSA 환경이다)
또한 Eureka server에 설정된 Eviction timer가 종료되기 전까지 유레카에 남게되는 문제도 있다.
해결
Graceful shutdown을 적용했다.
스프링 부트
spring:
application:
name: payment-service
config:
import: classpath:application-database.yml # database 속성 가져오기용
profiles:
default: dev
lifecycle:
timeout-per-shutdown-phase: 10s # 여기 1 !!!!
server:
shutdown: graceful # 애플리케이션 종료 시 정상 종료 (Graceful Shutdown) # 여기 2 !!!
spring.lifecycle.timeout-per-shutdown-phase를 10초로 주어서 종료 전까지 받은 요청을 처리하도록 했다.
server.shutdown을 graceful로 설정해주었다.
도커 컴포즈
services:
payment-server:
# // ...
stop_grace_period: 15s # 여기 1 !!!
stop_signal: SIGTERM # 여기 2 !!!
depends_on:
- eureka-server
stop_signal을 SIGTERM을 주었다.
stop_grace_period를 15초를 주어서, 스프링의 10초보다 5초 넉넉히 주어서 스프링이 종료 후 도커 컨테이너가 종료되도록 했다.
반응형
'TIL ✍️' 카테고리의 다른 글
TIL #118 : 롬복 @RequiredArgsConstructor 사용 시 @Qualifier 사용 불가 해결하기 (0) | 2024.11.13 |
---|---|
TIL #117 : 인텔리제이 프로젝트 구조의 하위 디렉토리 전부 펼치기 단축키 (0) | 2024.11.13 |
TIL #115 : 자바에서 offset 있는 DateTime 파싱하기 (0) | 2024.11.13 |
TIL #114 : Spring Security 없이 PasswordEncoder 이용하기 (0) | 2024.11.13 |
TIL #113 : Assertj로 LocalDateTime.now() 단위 테스트 코드 작성하기 (0) | 2024.11.13 |