Disposability

2025. 3. 2. 14:42Spring 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