728x90
서킷 브레이커 패턴(Circuit Breaker Pattern)은 마이크로서비스 아키텍처에서 시스템의 안정성과 탄력성을 향상시키기 위해 사용하는 중요한 설계 패턴이다. 이 패턴의 주요 목적은 서비스 간의 장애 전파를 방지하고 실패한 서비스와의 불필요한 호출을 줄여 시스템의 복구를 돕는 것이다.
주요 개념
- 회로 차단기처럼 동작
서킷 브레이커는 전기 회로 차단기와 유사하게 작동한다. 시스템에서 특정 조건(예: 실패 횟수나 시간 초과)이 발생하면 서킷 브레이커는 "열림(open)" 상태가 되어 추가 요청을 차단한다. 서비스가 복구되었다고 판단될 때 "닫힘(closed)" 상태로 돌아간다. - 상태
서킷 브레이커는 다음 세 가지 상태를 가집니다:- Closed (닫힘) : 정상 상태로 모든 요청이 서비스로 전달된다.
- Open (열림) : 서비스가 비정상 상태로 판단되어 모든 요청을 즉시 실패 처리한다.
- Half-Open (반열림) : 제한된 수의 요청을 허용하여 서비스가 복구되었는지 테스트한다. 성공적인 응답이 오면 "닫힘" 상태로 돌아간다.
동작 흐름
- 정상 상태 (Closed)
- 서킷 브레이커는 요청을 서비스로 전달한다.
- 요청 실패율이 설정된 임계치를 초과하면 "열림(Open)" 상태로 전환한다.
- 열림 상태 (Open)
- 추가적인 요청은 즉시 차단되고 대체 로직(예: 캐싱된 데이터 반환, 기본값 제공)을 수행한다.
- 일정 시간이 지나면 "반열림(Half-Open)" 상태로 전환된다.
- 반열림 상태 (Half-Open)
- 제한된 수의 요청을 허용하여 서비스 상태를 확인한다.
- 요청이 성공하면 "닫힘(Closed)" 상태로 돌아가고 실패하면 다시 "열림(Open)" 상태가 된다.
서킷 브레이커 패턴의 장점
- 장애 확산 방지
한 서비스의 장애가 다른 서비스로 전파되는 것을 막아 시스템 전체의 안정성을 높인다. - 시스템 성능 보호
실패한 서비스에 반복적으로 호출을 시도하지 않으므로 리소스를 절약하고 응답 시간을 단축한다. - 복구 지원
"반열림" 상태를 통해 서비스가 정상으로 돌아오면 빠르게 복구할 수 있다.
사용 사례
- 분산 시스템에서의 네트워크 오류 처리
- 서로 다른 마이크로서비스 간 호출
- 외부 API 호출에서의 제한된 재시도 로직
구현 예시 (Java - Resilience4j 라이브러리 사용)
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // 실패율 임계치
.waitDurationInOpenState(Duration.ofSeconds(10)) // Open 상태 유지 시간
.slidingWindowSize(20) // 슬라이딩 윈도우 크기
.build();
CircuitBreaker circuitBreaker = CircuitBreaker.of("myCircuitBreaker", circuitBreakerConfig);
Supplier<String> decoratedSupplier = CircuitBreaker.decorateSupplier(
circuitBreaker,
() -> someRemoteServiceCall()
);
Try<String> result = Try.ofSupplier(decoratedSupplier)
.recover(throwable -> "Fallback response"); // 대체 로직
결론
서킷 브레이커 패턴은 마이크로서비스 아키텍처에서 필수적인 안정성 확보 기술 중 하나다. 이를 통해 시스템은 장애에 더욱 강건해지고 장애 상황에서도 유연한 대처가 가능하다.
반응형
'Architecture' 카테고리의 다른 글
저장소 분리 패턴 (2) | 2024.12.25 |
---|---|
마이크로서비스 통신 패턴 (동기, 비동기) (0) | 2024.12.25 |
MSA에서 인증/인가 패턴 (0) | 2024.12.21 |
BFF 패턴의 개념 (1) | 2024.12.20 |
API 게이트웨이 패턴이란? (2) | 2024.12.20 |