@CircuitBreaker의 name 속성
2024. 12. 12. 19:59ㆍSpring Microservice
@CircuitBreaker
의 name
속성은 회로 차단기의 구성을 식별하고 관리하기 위한 중요한 속성입니다. 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. 전체 동작 흐름
@CircuitBreaker 어노테이션:
- 메서드에
@CircuitBreaker(name = "licenseService")
를 선언하여 회로 차단기를 적용. name
으로 해당 회로 차단기의 동작을 설정 파일에서 정의.
- 메서드에
Resilience4j 설정 파일:
licenseService
라는 이름에 대해 개별 설정을 적용.- 글로벌 설정(
default
)과 차별화된 동작을 구성 가능.
실행 시 동작:
- Resilience4j는
name
에 해당하는 설정을 읽어 동작. - 실패율, 대기 시간, 윈도우 크기 등 설정값에 따라 회로 차단기의 상태를 전환.
- Resilience4j는
모니터링 및 유지보수:
name
을 기준으로 Actuator 대시보드에서 상태를 확인.- 회로 차단기별 통계(성공률, 실패율, Open 횟수 등)를 분석.
6. 결론
@CircuitBreaker
의 name
속성은 다음과 같은 이유로 필요합니다:
- 회로 차단기를 구분하여 여러 서비스 호출에 대해 각각의 동작을 개별적으로 구성.
- 설정 관리와 모니터링에서 중요한 역할.
- 애플리케이션의 유지보수성과 확장성을 높이는 핵심 속성.
이 속성을 통해 회로 차단기의 동작을 세분화하고, 복잡한 애플리케이션에서도 장애 관리와 복구를 효율적으로 수행할 수 있습니다.
'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 |