Bulkhead 패턴

날아올라돼지야·2024년 8월 29일
0

1. Bulkhead 패턴의 개요

Bulkhead 패턴은 시스템 내의 컴포넌트나 서비스를 격리하여 특정 서비스의 실패나 과부하가 다른 서비스로 전파되는 것을 방지하는 패턴입니다. 이 패턴은 마이크로서비스 네트워크에서 리소스를 효율적으로 할당하고 관리함으로써 전체 시스템의 안정성과 복원력을 높이는 데 도움을 줍니다.

2. 배경 설명

이 패턴의 영감은 선박의 격벽(bulkhead)에서 나왔습니다. 선박에서 격벽은 물리적으로 선체를 분리하여 특정 구획에 물이 들어오더라도 다른 구획에 영향을 미치지 않도록 합니다. 마찬가지로, Bulkhead 패턴을 사용하면 소프트웨어 시스템에서도 특정 서비스가 과부하나 오류로 인해 다른 서비스에 영향을 미치지 않도록 리소스를 분리하고 제한할 수 있습니다.

3. Bulkhead 패턴의 필요성

예를 들어, Accounts 마이크로서비스에서 두 개의 API가 있다고 가정합니다: myAccountmyCustomerDetails.

  • myAccount API는 간단한 요청을 처리하고 다른 서비스에 의존하지 않습니다.
  • myCustomerDetails APILoansCards 마이크로서비스와 통신하여 복잡한 작업을 수행합니다.

이 경우, myCustomerDetails API가 모든 스레드와 리소스를 소비하면, myAccount API는 리소스 부족으로 인해 느려지거나 실패할 수 있습니다. Bulkhead 패턴은 각 API에 대해 리소스를 할당하여 이러한 문제를 방지합니다.

4. Bulkhead 패턴 구현

Spring Cloud Gateway에서는 현재 Bulkhead 패턴을 지원하지 않으므로, Resilience4j 라이브러리를 사용하여 구현할 수 있습니다.

  1. 의존성 추가:
    Bulkhead 패턴을 구현하려면 Resilience4j 라이브러리를 프로젝트에 추가해야 합니다.

    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-bulkhead</artifactId>
    </dependency>
  2. Bulkhead 어노테이션 사용:
    Bulkhead 패턴을 적용하려는 메서드에 @Bulkhead 어노테이션을 추가합니다.

    @Bulkhead(name = "myBulkhead", type = Bulkhead.Type.THREADPOOL)
    public String myCustomerDetails() {
        // 복잡한 비즈니스 로직 수행
        return "Customer Details";
    }
    • name: Bulkhead 설정의 이름을 지정합니다.
    • type: THREADPOOL 타입을 사용하여 스레드 풀을 통해 리소스를 격리합니다.
  3. 설정 추가:
    application.yml 파일에 Bulkhead 설정을 추가합니다.

    resilience4j:
      bulkhead:
        configs:
          default:
            maxConcurrentCalls: 10
            maxWaitDuration: 100ms
          threadpool:
            coreThreadPoolSize: 5
            maxThreadPoolSize: 10
            queueCapacity: 25
    • maxConcurrentCalls: 동시에 허용되는 최대 호출 수를 설정합니다.
      • maxWaitDuration: 리소스가 부족할 때, 대기할 최대 시간을 설정합니다.
    • coreThreadPoolSize: 최소 스레드 풀 크기입니다.
    • maxThreadPoolSize: 최대 스레드 풀 크기입니다.
    • queueCapacity: 요청이 대기할 수 있는 큐의 크기를 설정합니다.

5. Bulkhead 패턴 테스트

Bulkhead 패턴을 테스트하기 위해서는 JMeter나 LoadRunner와 같은 성능 테스트 도구를 사용하여 많은 요청을 보내고 각 API의 리소스 사용량을 관찰해야 합니다.

하지만 이 과정은 복잡하고 전문적인 도구와 지식이 필요합니다. 따라서 실제 프로젝트에서 Bulkhead 패턴을 사용하려면 성능 테스트 팀과 협력하여 설정을 검증하고 최적화하는 것이 중요합니다.

6. 결론

Bulkhead 패턴은 마이크로서비스 환경에서 개별 서비스 간의 격리를 통해 전체 시스템의 안정성을 높이는 강력한 방법입니다. 이 패턴을 사용하면 특정 서비스의 문제로 인해 전체 시스템이 영향을 받는 것을 방지할 수 있습니다. 비즈니스 요구 사항에 따라 다양한 리소스 할당과 격리 전략을 구현할 수 있으며, 이를 통해 시스템의 복원력과 성능을 크게 향상시킬 수 있습니다.

profile
무슨 생각하며 사니

0개의 댓글