2024. 12. 12. 17:58ㆍSpring Microservice
Circuit Breaker 패턴: 상세 설명
1. Circuit Breaker 패턴이란?
Circuit Breaker 패턴은 소프트웨어 시스템에서 장애 복원력을 향상시키기 위해 사용하는 오류 처리와 안정성 강화 설계 기법입니다. 특히, 네트워크 호출이나 외부 서비스와의 통신에서 장애가 발생할 경우 이를 빠르게 감지하고 전체 시스템의 성능 저하를 방지하는 데 초점을 둡니다.
이 패턴은 전기 회로 차단기에서 영감을 받아 만들어졌습니다. 전기 회로 차단기가 과부하 시 전력을 차단하듯, Circuit Breaker는 연속된 실패를 감지하여 시스템이 과부하되지 않도록 호출을 차단합니다.
2. Circuit Breaker가 필요한 이유
문제 상황
- 서비스 호출 실패: 네트워크가 불안정하거나 외부 서비스가 응답하지 않을 때, 호출은 지속적으로 실패합니다.
- 자원 고갈: 지속적으로 실패한 요청은 애플리케이션의 자원을 소모시켜 전체 시스템 성능을 악화시킬 수 있습니다.
- 장애 전파: 하나의 서비스 장애가 다른 서비스로 확산될 위험이 있습니다.
Circuit Breaker의 해결 방식
- 일정 임계치를 초과한 요청 실패를 감지하여, 자동으로 서비스 호출을 차단.
- 차단된 동안에는 실패한 서비스에 요청을 보내지 않고, 즉시 대체 응답(fallback)을 제공합니다.
- 차단 기간 이후 서비스 상태를 점검(Half-Open)하고 복구 여부를 확인합니다.
3. Circuit Breaker의 상태
Circuit Breaker는 3가지 상태를 통해 요청의 흐름을 제어합니다:
Closed (닫힘):
- 정상 상태입니다. 모든 요청이 외부 서비스로 전달됩니다.
- 실패율이 허용 임계치 이하라면 Closed 상태가 유지됩니다.
- 실패율이 임계치를 초과하면 Open 상태로 전환됩니다.
Open (열림):
- 서비스 장애를 감지한 상태입니다. 요청을 외부 서비스로 전달하지 않고 바로 실패로 처리하거나 대체 로직(fallback)을 실행합니다.
- 일정 시간 동안 모든 요청이 차단됩니다.
- 설정된 대기 시간이 지나면 Half-Open 상태로 전환됩니다.
Half-Open (반열림):
- 제한된 수의 요청만 외부 서비스로 전달하여 복구 여부를 테스트합니다.
- 성공률이 임계치 이상이라면 Closed로 전환됩니다.
- 실패율이 다시 높으면 Open 상태로 돌아갑니다.
4. Circuit Breaker의 동작 원리
동작 과정
정상 상태 (Closed):
- 모든 요청이 외부 서비스로 전달됩니다.
- 실패율을 계산하여 문제가 없으면 Closed 상태 유지.
오류 발생 및 Open 전환:
- 오류 발생률(예: 50%) 또는 실패 요청 횟수(예: 10회)가 설정된 임계치를 초과하면 Open 상태로 전환.
- 이후 요청은 즉시 차단하고, 대체 응답(fallback) 제공.
대기 시간 경과 후 Half-Open:
- 일정 시간(예: 10초)이 지나면 일부 요청을 다시 외부 서비스로 전달.
- 요청 성공 여부를 확인하여 Closed 또는 Open 상태로 전환.
복구 또는 Open 유지:
- 복구된 경우 Closed로 돌아가 정상 요청을 재개.
- 실패율이 여전히 높다면 Open 상태를 유지.
5. Circuit Breaker의 주요 구성 요소
Failure Detection (실패 감지):
- 실패 요청의 비율 또는 수를 계산.
- 임계치를 초과하면 Open 상태로 전환.
Fallback (대체 응답):
- 외부 서비스 호출이 실패하거나 차단된 경우 실행할 대체 로직.
- 예: 캐시에서 데이터 반환, 기본 응답 제공.
Recovery Check (복구 확인):
- Half-Open 상태에서 제한된 요청으로 서비스 복구 여부를 확인.
Monitoring (모니터링):
- Circuit Breaker 상태(Open/Closed/Half-Open)와 호출 통계를 모니터링.
6. Spring Boot에서의 Circuit Breaker 구현
Spring Boot에서 Circuit Breaker를 구현하려면 Resilience4j를 사용하는 것이 일반적입니다. Resilience4j는 가벼운 라이브러리로, 다음과 같은 기능을 제공합니다:
- Circuit Breaker
- Rate Limiter
- Retry
- Bulkhead
7. 구체적인 구현 예제
설정 파일
application.yml
에 Circuit Breaker 구성:
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowType: COUNT_BASED
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 5s
permittedNumberOfCallsInHalfOpenState: 3
instances:
exampleService:
baseConfig: default
Service 클래스
서비스 호출에 Circuit Breaker 적용:
@Service
public class ExternalService {
@CircuitBreaker(name = "exampleService", fallbackMethod = "fallbackResponse")
public String callExternalService() {
// 외부 API 호출
if (Math.random() > 0.7) { // 실패 시뮬레이션
throw new RuntimeException("Service Failure");
}
return "Service Success";
}
public String fallbackResponse(Throwable t) {
return "Fallback response: " + t.getMessage();
}
}
Controller
서비스를 호출하는 Controller:
@RestController
@RequestMapping("/api")
public class ExampleController {
private final ExternalService externalService;
public ExampleController(ExternalService externalService) {
this.externalService = externalService;
}
@GetMapping("/external")
public String getExternalServiceResponse() {
return externalService.callExternalService();
}
}
Actuator 모니터링
/actuator/circuitbreakers
엔드포인트에서 Circuit Breaker 상태를 확인할 수 있습니다.
8. Circuit Breaker 패턴의 장점
장애 전파 방지:
- 실패한 서비스 호출을 차단하여 장애가 다른 서비스로 확산되는 것을 방지.
시스템 안정성 보장:
- 실패한 요청을 빠르게 차단하여 애플리케이션의 자원 낭비를 최소화.
빠른 대체 응답:
- Fallback 메커니즘으로 사용자 경험을 개선.
복구 확인 가능:
- Half-Open 상태를 통해 서비스 복구 여부를 효율적으로 테스트.
9. 사용 시 고려 사항
- 설정 값 튜닝: 실패율 임계치, 슬라이딩 창 크기, 대기 시간 등 설정이 애플리케이션에 적합해야 함.
- Fallback 로직 설계: 적절한 대체 응답을 제공해야 사용자 경험을 해치지 않음.
- 모니터링: Actuator, Prometheus, Grafana 등을 통해 Circuit Breaker 상태를 지속적으로 관찰.
이 패턴은 마이크로서비스 환경에서 특히 효과적이며, 높은 장애 회복력과 성능을 보장합니다. 추가로 궁금한 점이 있다면 알려주세요!
'Spring Microservice' 카테고리의 다른 글
fallback 패턴 활용 예 (0) | 2024.12.12 |
---|---|
fallback 패턴 (0) | 2024.12.12 |
@FeignClient (0) | 2024.12.11 |
@LoadBalanced (0) | 2024.12.11 |
eureka server configuration (0) | 2024.12.11 |