Bulkhead 패턴이란? 장애를 격리하는 설계 원칙

Bulkhead 패턴의 정의

Bulkhead는 원래 배의 ‘격벽’을 뜻하는 단어입니다. 배 내부를 여러 개의 방수 구역으로 나눠두면, 한쪽에 구멍이 나서 물이 차더라도 그 구역만 침수되고 배 전체가 가라앉지는 않습니다. 소프트웨어 아키텍처에서 Bulkhead 패턴도 같은 원리를 적용합니다. 시스템의 자원(스레드, 커넥션, 프로세스 등)을 서비스나 기능 단위로 분리해두어, 특정 부분에 장애가 발생해도 나머지 시스템까지 연쇄적으로 무너지지 않도록 격리하는 설계 원칙입니다.

동작 원리와 예시

가장 흔한 예는 스레드 풀 분리입니다. 하나의 애플리케이션이 A, B, C라는 세 개의 외부 API를 호출한다고 가정해봅시다. 만약 모든 호출이 동일한 스레드 풀을 공유한다면, API C가 응답 지연을 일으킬 경우 그 요청들이 스레드를 계속 점유하게 되고, 결국 A와 B를 호출할 스레드마저 고갈되어 전체 서비스가 마비될 수 있습니다.

Bulkhead 패턴을 적용하면 A, B, C 각각에 독립된 스레드 풀이나 커넥션 풀을 할당합니다. 예를 들어 A용 풀 10개, B용 풀 10개, C용 풀 10개로 나누면, C가 아무리 느려지고 실패해도 C 전용 풀만 소진될 뿐 A와 B는 정상적으로 동작합니다. 코드 레벨에서는 ThreadPoolExecutor를 서비스별로 따로 생성하거나, Resilience4j 같은 라이브러리의 Bulkhead 모듈을 이용해 ‘동시 실행 개수’나 ‘대기 큐 크기’를 제한하는 방식으로 구현합니다.

실무에서 왜 쓰는지

마이크로서비스 환경에서는 하나의 서비스가 여러 하위 서비스에 의존하는 경우가 많습니다. 이때 의존하는 서비스 중 하나만 느려져도 자원을 공유하는 구조라면 전체 시스템이 도미노처럼 무너지는 ‘장애 전파’가 일어날 수 있습니다. Bulkhead 패턴은 이런 위험을 사전에 차단하는 안전장치 역할을 합니다.

  • 특정 API 장애가 전체 서비스 다운으로 번지는 것을 방지
  • 서비스별 자원 사용량을 예측 가능하게 관리
  • 장애 발생 시 원인 파악과 복구 범위를 좁혀 대응 속도 향상

실무에서는 Circuit Breaker 패턴과 함께 사용되는 경우가 많습니다. Bulkhead가 자원을 물리적으로 분리해 피해 범위를 줄이고, Circuit Breaker가 장애를 감지해 호출 자체를 차단하는 식으로 서로 보완적인 역할을 합니다. 두 패턴을 함께 적용하면 훨씬 견고한 장애 대응 체계를 만들 수 있습니다.

관련 글

댓글 남기기