서킷브레이커 사용시 예외 문제 - Genie-Uss/genieus GitHub Wiki
- 문제 상황
- 서킷브레이커와 리트라이를 함께 적용할 때, Fallback 메서드가 호출되었음에도 예외가 정상 처리되지 않고 다시 Retry가 발생하는 현상 발생
- Fallback 메서드 내부에서 예외를 던졌지만, Retry 로직이 이를 감지하지 못하고 무한 반복하거나, 의도한 대로 실패 처리가 되지 않는 문제 발생
- 특히
FeignException.FeignClientException
, 비즈니스 예외 (4xx 응답)과 같은 예외에 대해서도 불필요하게 리트라이가 시도되는 문제가 나타남
- 원인 분석
- Resilience4j Retry가 기본적으로 메서드에서 발생하는 모든 예외를 재시도 대상으로 간주함
- Fallback 메서드에서 던지는 예외가 Retry의
ignoreExceptions
설정에 포함되지 않으면, 재시도 대상이 되어 버그가 발생
- 또한, 서킷브레이커와 리트라이가 모두 fallbackMethod를 공유하면 예외 흐름이 꼬여서 예상치 못한 재시도/실패 동작이 발생함
- 해결 방법
- Retry 설정에서 재시도 대상 예외(
retryExceptions
)와 무시할 예외(ignoreExceptions
)를 명확히 분리 설정
- 예:
FeignClientException
은 무조건 무시(ignore
), FeignServerException
이나 RetryableException
만 재시도
- Fallback은 서킷브레이커 레벨에서만 적용하고, Retry에서는 Fallback을 적용하지 않도록 구조 수정
- Retry 실패 → 바로 서킷브레이커로 넘기고, 최종적으로 서킷브레이커 Fallback만 타도록 설계
- Fallback 내부에서는 다시 일반 Exception 대신, 커스텀 Business Exception을 명확히 던져 흐름을 제어
- 예: "PromotionServiceFailureException"처럼 특정 실패를 의미하는 커스텀 예외를 던짐
- 적용 결과
- 4xx 에러는 즉시 실패 처리하여 무의미한 재시도 방지
- 서버 장애(5xx, 네트워크 오류)는 3회까지 재시도 후, 서킷브레이커 Open → Fallback 정상 동작
- 시스템 안정성과 장애 대응 속도가 모두 개선됨