2025. 3. 2. 14:42ㆍSpring Microservice
📌 Disposability (폐기 가능성)
(Twelve-Factor App 원칙: 서비스는 쉽게 시작되고 종료될 수 있어야 한다.)
마이크로서비스는 언제든지 시작(Start) 및 종료(Shutdown)될 수 있어야 하며,
이 과정이 다른 서비스에 영향을 미치지 않아야 합니다.
이를 통해 탄력적 확장(Elastic Scaling)과 빠른 배포(Rapid Deployment)가 가능해집니다.
🔹 1. Disposability(폐기 가능성)이란?
- 마이크로서비스는 즉시 시작 및 종료될 수 있어야 함.
- 실패한 인스턴스를 자동으로 교체할 수 있어야 함.
- 애플리케이션 실행 시간이 짧아야 하며, 배포 시 빠르게 반영 가능해야 함.
- 컨테이너 환경(Docker, Kubernetes)과 오토스케일링(Auto Scaling)과의 궁합이 좋음.
📌 아래 다이어그램은 Disposability 원칙을 기반으로 인스턴스를 교체하는 방법을 보여줍니다.
[기존 인스턴스]
┌──────────────────────┐
│ Order Service (Fail) │ ← 장애 발생 → 즉시 종료
└──────────────────────┘
[새로운 인스턴스]
┌──────────────────────┐
│ Order Service (New) │ ← 새로운 인스턴스로 교체
└──────────────────────┘
✅ 기존 인스턴스가 실패하면 즉시 새로운 인스턴스를 시작하여 서비스 지속성 보장
✅ 자동 복구(Auto Recovery)가 가능해야 하며, 서비스 중단 없이 장애 대응 가능
🔹 2. Disposability를 적용하는 방법
✅ (1) 빠른 시작(Startup)과 종료(Shutdown)
📌 Spring Boot에서 애플리케이션 시작 시간을 단축하는 방법
spring:
main:
lazy-initialization: true # 지연 초기화 활성화 (필요한 빈만 로드)
datasource:
hikari:
maximum-pool-size: 5 # DB 커넥션 풀 크기 제한
jpa:
hibernate:
ddl-auto: none # Hibernate DDL 실행 방지 (최초 실행 속도 개선)
✅ 불필요한 초기화 작업을 줄여 애플리케이션 실행 속도를 향상.
✅ Hibernate의 DDL 자동 실행을 방지하여 DB 연결 속도를 개선.
✅ (2) Kubernetes에서 실패한 인스턴스 자동 교체
📌 Kubernetes의 Liveness Probe(실행 상태 체크) 및 Readiness Probe(준비 상태 체크) 설정
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
✅ 서비스가 실패하면 즉시 새로운 인스턴스를 시작하여 자동 복구 가능.
✅ Liveness Probe → 서비스가 정상적으로 실행 중인지 확인하고 비정상이면 재시작.
✅ Readiness Probe → 서비스가 요청을 받을 준비가 되었는지 확인.
✅ (3) Zero-Downtime 배포(무중단 배포)
📌 Rolling Update 전략 (Kubernetes)
kubectl set image deployment/my-microservice my-microservice=my-microservice:v2
✅ 기존 서비스가 실행되는 동안 새로운 버전의 서비스가 점진적으로 배포됨.
✅ 트래픽을 점진적으로 새로운 서비스로 전환하여 중단 없이 배포 가능.
📌 Blue-Green Deployment 전략 (AWS, Kubernetes)
- Blue 환경: 현재 실행 중인 애플리케이션 (v1)
- Green 환경: 새로운 애플리케이션 버전 (v2) 배포
- 트래픽을 v1에서 v2로 전환 → 실패 시 즉시 롤백 가능.
✅ 배포 중에도 기존 서비스는 정상적으로 동작해야 함.
✅ 문제가 발생하면 즉시 이전 버전으로 롤백 가능.
🔹 3. Disposability가 중요한 이유
✅ 자동 장애 복구(Auto Recovery)
- 특정 인스턴스에서 장애가 발생해도 자동으로 새로운 인스턴스를 실행하여 서비스 지속성 유지.
✅ 빠른 배포(Rapid Deployment)
- 서비스가 몇 초 안에 시작될 수 있어야 새로운 코드 변경 사항을 빠르게 반영 가능.
✅ 탄력적 확장(Elastic Scaling) 지원
- 트래픽이 증가하면 새로운 인스턴스를 즉시 추가,
트래픽이 감소하면 불필요한 인스턴스를 자동 종료.
✅ 컨테이너 환경(Docker, Kubernetes)과의 궁합이 뛰어남
- 컨테이너 기반 아키텍처에서는 기존 인스턴스를 제거하고 새로운 인스턴스를 실행하는 방식이 일반적.
📌 결론: Disposability 적용 원칙
1️⃣ 마이크로서비스는 빠르게 시작(Startup) 및 종료(Shutdown)될 수 있어야 함.
2️⃣ 애플리케이션이 실패하면 즉시 새로운 인스턴스를 실행할 수 있도록 설계해야 함.
3️⃣ Kubernetes Liveness Probe 및 Readiness Probe를 활용하여 자동 장애 복구(Auto Recovery) 가능하도록 설정해야 함.
4️⃣ Rolling Update, Blue-Green Deployment를 활용하여 무중단 배포(Zero-Downtime Deployment) 가능하도록 설계해야 함.
5️⃣ 트래픽 증가 시, 새로운 인스턴스를 즉시 추가하여 탄력적 확장(Elastic Scaling)이 가능해야 함.
🔹 이를 통해 장애에 강하고 배포가 빠른 클라우드 네이티브 마이크로서비스를 구축할 수 있습니다! 🚀
'Spring Microservice' 카테고리의 다른 글
Logs (0) | 2025.03.02 |
---|---|
Dev/prod parity (0) | 2025.03.02 |
Concurrency (0) | 2025.03.02 |
Port binding (0) | 2025.03.02 |
Processes (0) | 2025.03.02 |