벌크헤드 패턴(Bulkhead Pattern)은 시스템을 격리된 구획으로 분리해 한 부분의 장애가 전체로 전파되지 않도록 하는 탄력성 패턴이다. 선박의 격벽(bulkhead)에서 이름을 따왔다.
핵심 개념
장애 격리(Failure Isolation):
결제 서비스 과부하 → 결제 스레드 풀만 소진
→ 주문 서비스, 배송 서비스는 정상 동작
구획 전략:
1. 스레드 풀 격리: 서비스별 별도 스레드 풀
2. 세마포어 격리: 최대 동시 요청 제한
3. 프로세스/컨테이너 격리
스레드 풀 격리 (Hystrix)
java
// Hystrix 스레드 풀 격리
@HystrixCommand(
commandKey = "paymentService",
threadPoolKey = "payment-pool", // 별도 스레드 풀
threadPoolProperties = {
@HystrixProperty(name="coreSize", value="10"),
@HystrixProperty(name="maxQueueSize", value="100")
},
fallbackMethod = "paymentFallback"
)
public PaymentResult processPayment(Order order) {
return paymentClient.process(order);
}
// 다른 서비스는 다른 스레드 풀
@HystrixCommand(threadPoolKey = "inventory-pool", ...)
public boolean checkInventory(String productId) { ... }
Resilience4j 벌크헤드
java
// 세마포어 방식
BulkheadConfig config = BulkheadConfig.custom()
.maxConcurrentCalls(10) // 최대 동시 10개
.maxWaitDuration(Duration.ofMs(100))
.build();
Bulkhead bulkhead = Bulkhead.of("paymentService", config);
// 데코레이터
CheckedSupplier<PaymentResult> decorated =
Bulkhead.decorateCheckedSupplier(bulkhead,
() -> paymentClient.process(order));
yaml
# 컨테이너 레벨 격리
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m" # CPU 소진해도 다른 컨테이너에 영향 없음
memory: "1Gi" # OOM 시 이 컨테이너만 종료
패턴 조합
| 패턴 | 목적 | 조합 |
|---|
| 벌크헤드 | 장애 격리 | 서킷 브레이커와 함께 |
| 서킷 브레이커 | 빠른 실패 | 재시도 패턴과 함께 |
| 재시도 | 일시적 장애 | 타임아웃과 함께 |
| 타임아웃 | 무한 대기 방지 | 폴백과 함께 |
관련 개념