JAVA · 디자인패턴
벌크헤드 패턴
장애 격리를 위해 자원을 분할하는 벌크헤드 패턴입니다.
디자인패턴고급Bulkhead벌크헤드장애격리Semaphore
핵심 설명
장애 격리를 위해 자원을 분할하는 벌크헤드 패턴입니다.
Java code
import java.util.concurrent.*;
public class BulkheadPattern {
// 스레드 풀 기반 벌크헤드
static class Bulkhead {
private final String name;
private final Semaphore semaphore;
private final ExecutorService executor;
Bulkhead(String name, int maxConcurrent) {
this.name = name;
this.semaphore = new Semaphore(maxConcurrent);
this.executor = Executors.newFixedThreadPool(maxConcurrent);
}
<T> CompletableFuture<T> execute(Callable<T> task) {
return CompletableFuture.supplyAsync(() -> {
try {
if (!semaphore.tryAcquire(1, TimeUnit.SECONDS)) {
throw new RuntimeException(name + " 벌크헤드 포화");
}
try {
return task.call();
} finally {
semaphore.release();
}
} catch (Exception e) {
throw new CompletionException(e);
}
}, executor);
}
void shutdown() { executor.shutdown(); }
}
public static void main(String[] args) throws Exception {
// 서비스별 격리된 벌크헤드
Bulkhead orderBulkhead = new Bulkhead("주문", 3);
Bulkhead paymentBulkhead = new Bulkhead("결제", 2);
// 주문 서비스 장애가 결제에 영향 안 줌
var orderResult = orderBulkhead.execute(() -> {
Thread.sleep(100);
return "주문 처리 완료";
});
var payResult = paymentBulkhead.execute(() -> {
Thread.sleep(50);
return "결제 처리 완료";
});
System.out.println(orderResult.get());
System.out.println(payResult.get());
orderBulkhead.shutdown();
paymentBulkhead.shutdown();
}
}학습 팁
벌크헤드는 선박의 격벽에서 유래했습니다. 한 구획에 침수가 발생해도 다른 구획은 안전한 것처럼, 서비스 장애를 격리합니다.
주의할 점
벌크헤드의 동시 실행 수를 너무 작게 설정하면 정상 트래픽도 거부됩니다. 부하 테스트로 적정 값을 찾으세요.
자주 묻는 질문
벌크헤드 패턴란 무엇인가요?
장애 격리를 위해 자원을 분할하는 벌크헤드 패턴입니다.
벌크헤드 패턴 학습 시 주의할 점은 무엇인가요?
벌크헤드의 동시 실행 수를 너무 작게 설정하면 정상 트래픽도 거부됩니다. 부하 테스트로 적정 값을 찾으세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.