@CircuitBreaker의 name 속성

2024. 12. 12. 19:59Spring Microservice

@CircuitBreakername 속성은 회로 차단기의 구성을 식별하고 관리하기 위한 중요한 속성입니다. Spring Boot와 Resilience4j 같은 라이브러리에서, 여러 회로 차단기를 사용하는 애플리케이션에서 각각의 회로 차단기를 구분하고 개별적으로 설정할 수 있도록 돕는 역할을 합니다.


1. name 속성의 역할

a) 회로 차단기 식별

  • name 속성은 회로 차단기 이름을 지정합니다.
  • 이 이름은 애플리케이션 내에서 해당 회로 차단기를 식별하는 고유한 키로 사용됩니다.
  • 하나의 애플리케이션이 여러 서비스 호출을 관리하는 경우, 각 호출에 대해 고유한 회로 차단기를 구성할 수 있습니다.

b) 개별 설정 적용

  • name을 기준으로 각 회로 차단기의 동작 방식을 개별적으로 설정할 수 있습니다.
  • Resilience4j 설정 파일(application.yml 또는 application.properties)에서 name과 매핑되는 설정을 제공하여 동작을 세분화할 수 있습니다.

2. 사용 예제

회로 차단기 정의

@CircuitBreaker(name = "licenseService", fallbackMethod = "buildFallbackLicenseList")
public List<License> getLicenses(String organizationId) {
    // 외부 서비스 호출 로직
    return externalLicenseService.fetchLicenses(organizationId);
}

public List<License> buildFallbackLicenseList(String organizationId, Throwable throwable) {
    return List.of(new License("Fallback License", "Default description"));
}

application.yml에서 name에 해당하는 설정

resilience4j:
  circuitbreaker:
    configs:
      default:
        slidingWindowType: COUNT_BASED
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 10s
    instances:
      licenseService:  # `name`에 해당하는 설정
        baseConfig: default
        slidingWindowSize: 20    # 개별 설정 적용
        failureRateThreshold: 40
        waitDurationInOpenState: 5s

설명:

  • licenseService라는 이름을 기준으로 회로 차단기의 동작(슬라이딩 윈도우 크기, 실패율 임계치 등)을 별도로 설정합니다.
  • 다른 회로 차단기(otherService 등)가 있다면 name으로 각각을 구분하여 별도의 설정을 적용할 수 있습니다.

3. 용도와 이점

a) 멀티 회로 차단기 관리

  • 애플리케이션이 여러 외부 서비스(예: LicenseService, PaymentService, DeliveryService)와 통신한다면, 각각의 서비스 호출에 대해 개별 회로 차단기를 정의할 수 있습니다.
  • name 속성을 통해 각 회로 차단기를 구분하고 개별 설정을 적용.

b) 유연한 구성

  • 특정 서비스에 따라 회로 차단기의 동작 방식을 다르게 설정할 수 있습니다.
    • 예: LicenseService는 실패율 40%에서 Open 상태로 전환.
    • 예: PaymentService는 실패율 60%에서 Open 상태로 전환.

c) 모니터링 및 대시보드에서의 구분

  • Actuator 엔드포인트(/actuator/circuitbreakers) 또는 Prometheus/Grafana 같은 모니터링 도구에서 name으로 회로 차단기를 구분.
  • 회로 차단기별 통계를 확인하여 장애 패턴을 분석하고 설정을 조정.

4. name 속성이 필요한 이유

1) 여러 회로 차단기 사용 시 필수

  • 애플리케이션이 단일 회로 차단기만 사용하는 경우 name이 필수가 아닐 수 있지만, 대부분의 애플리케이션은 다양한 외부 서비스와 통신합니다.
  • 예: LicenseService, PaymentService, DeliveryService에 대해 각각 다른 회로 차단기를 정의하려면 반드시 name으로 구분해야 합니다.

2) 글로벌 설정과 개별 설정의 조합

  • Resilience4j는 기본적으로 글로벌 설정(default)을 지원하지만, 특정 회로 차단기만 다르게 동작하도록 설정하려면 name이 필요합니다.
  • name에 따라 글로벌 설정을 재정의하거나 추가 설정을 제공.

3) 유지보수와 디버깅 용이성

  • 회로 차단기 이름으로 로그, 모니터링 대시보드, Actuator에서 각 회로 차단기를 식별할 수 있습니다.
  • 장애가 발생한 특정 서비스와 관련된 회로 차단기만 빠르게 확인 가능.

5. 전체 동작 흐름

  1. @CircuitBreaker 어노테이션:

    • 메서드에 @CircuitBreaker(name = "licenseService")를 선언하여 회로 차단기를 적용.
    • name으로 해당 회로 차단기의 동작을 설정 파일에서 정의.
  2. Resilience4j 설정 파일:

    • licenseService라는 이름에 대해 개별 설정을 적용.
    • 글로벌 설정(default)과 차별화된 동작을 구성 가능.
  3. 실행 시 동작:

    • Resilience4j는 name에 해당하는 설정을 읽어 동작.
    • 실패율, 대기 시간, 윈도우 크기 등 설정값에 따라 회로 차단기의 상태를 전환.
  4. 모니터링 및 유지보수:

    • name을 기준으로 Actuator 대시보드에서 상태를 확인.
    • 회로 차단기별 통계(성공률, 실패율, Open 횟수 등)를 분석.

6. 결론

@CircuitBreakername 속성은 다음과 같은 이유로 필요합니다:

  • 회로 차단기를 구분하여 여러 서비스 호출에 대해 각각의 동작을 개별적으로 구성.
  • 설정 관리와 모니터링에서 중요한 역할.
  • 애플리케이션의 유지보수성과 확장성을 높이는 핵심 속성.

이 속성을 통해 회로 차단기의 동작을 세분화하고, 복잡한 애플리케이션에서도 장애 관리와 복구를 효율적으로 수행할 수 있습니다.

'Spring Microservice' 카테고리의 다른 글

Reverse Proxy  (0) 2024.12.15
spring cloud gateway의 route predicate factories  (0) 2024.12.15
ring buffer bit  (0) 2024.12.12
bulkhead 패턴  (0) 2024.12.12
fallback 패턴 활용 예  (0) 2024.12.12