| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Domain-Driven
- BOJ
- subdomain
- CSRF
- Spring
- JPA
- event
- 안드로이드 스튜디오
- nopasswd
- 헥사고날 아키텍처
- 공통 언어
- EC2
- clean architecture
- Rabbit MQ
- spring boot
- 클린 아키텍처
- hexagonal
- android studio
- 헥사고날
- Ubiquitous Language
- Thymeleaf
- DTO Projection
- 이벤트 기반
- Spring Cloud
- Context map
- rabbitmq
- 컨텍스트 맵
- 백준
- Hexagonal Architecture
- Domain Driven
Archives
- Today
- Total
취미겸생업
[Spring boot] Resilience4j 서킷 브레이커 본문
SMALL
서킷 브레이커 (Resilience4j)
서킷 브레이커란
- 마이크로서비스 간의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지하는 패턴
- 외부 서비스 호출 실패 시 빠른 실패를 통해 장애를 격리하고, 시스템의 다른 부분에 영향을 주지 않도록 함
- 예시
- 초당 1만 건의 결제 트래픽 중 외부 API 응답 시간이 5초 이상 지연되어 스레드 풀 고갈이 발생할 때, 서킷을 차단(OPEN)하고 에러를 즉시 반환하여 스레드 확보 및 시스템 전면 마비 방지
- 메인 화면 접속자 폭주로 내부 추천 서버의 CPU 점유율이 100%에 도달해 응답 대기 스레드가 누적되는 위험이 발생할 때, 연결을 끊고 정적 캐시 데이터(Fallback)를 즉시 반환하여 스레드 병목 없이 대용량 접속을 소화
Resilience4j란
- Java 서킷 브레이커 오픈소스 라이브러리로, 넷플릭스가 Hystrix의 지원을 종료한 후 개발된 라이브러리
- 다양한 서킷 브레이커 기능을 제공하며, 장애 격리 및 빠른 실패를 통해 복원력 향상
Resilience4j 주요 특징

- Fallback: 호출 실패 시 대체 로직을 제공하여 시스템 안정성 확보
- 모니터링: 서킷 브레이커 상태를 모니터링하고 관리할 수 있는 다양한 도구 제공
- 상태
- 클로즈드(Closed)
- 모든 요청을 통과시키는 기본 상태, 호출이 실패하면 실패 카운터 증가
- 실패율이 설정된 임계값(예: 50%)을 초과하면 서킷 브레이커가 오픈 상태로 전환
- 예시: 최근 5번의 호출 중 3번이 실패하여 실패율이 60%에 도달하면 오픈 상태로 전환
- 오픈(Open)
- 모든 요청을 즉시 실패로 처리하며 바로 에러 응답을 반환
- 설정된 대기 시간이 지난 후, 서킷 브레이커는 하프-오픈 상태로 전환
- 예시: 서킷 브레이커가 오픈 상태로 전환되고 20초 동안 모든 요청이 차단
- 하프-오픈(Half-Open)
- 제한된 수의 요청을 허용하여 시스템이 정상 상태로 복구되었는지 확인, 요청이 성공하면 클로즈드 상태로 전환
- 요청이 다시 실패하면 서킷 브레이커는 다시 오픈 상태로 전환
- 예시: 하프-오픈 상태에서 3개의 요청을 허용하고, 모두 성공하면 클로즈드 상태로 전환, 만약 하나라도 실패하면 다시 오픈 상태로 전환
- 클로즈드(Closed)
Resilience4j 기본 설정
build.gradle
dependencies { implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0' implementation 'org.springframework.boot:spring-boot-starter-aop' }application.yml
resilience4j: circuitbreaker: configs: default: # 기본 구성 이름 registerHealthIndicator: true # 애플리케이션의 헬스 체크에 서킷 브레이커 상태를 추가하여 모니터링 가능 # 서킷 브레이커가 동작할 때 사용할 슬라이딩 윈도우의 타입을 설정 # COUNT_BASED: 마지막 N번의 호출 결과를 기반으로 상태를 결정 # TIME_BASED: 마지막 N초 동안의 호출 결과를 기반으로 상태를 결정 slidingWindowType: COUNT_BASED # 슬라이딩 윈도우의 타입을 호출 수 기반(COUNT_BASED)으로 설정 # 슬라이딩 윈도우의 크기를 설정 # COUNT_BASED일 경우: 최근 N번의 호출을 저장 # TIME_BASED일 경우: 최근 N초 동안의 호출을 저장 slidingWindowSize: 5 # 슬라이딩 윈도우의 크기를 5번의 호출로 설정 minimumNumberOfCalls: 5 # 서킷 브레이커가 동작하기 위해 필요한 최소한의 호출 수를 5로 설정 slowCallRateThreshold: 100 # 느린 호출의 비율이 이 임계값(100%)을 초과하면 서킷 브레이커가 동작 slowCallDurationThreshold: 60000 # 느린 호출의 기준 시간(밀리초)으로, 60초 이상 걸리면 느린 호출로 간주 failureRateThreshold: 50 # 실패율이 이 임계값(50%)을 초과하면 서킷 브레이커가 동작 permittedNumberOfCallsInHalfOpenState: 3 # 서킷 브레이커가 Half-open 상태에서 허용하는 최대 호출 수를 3으로 설정 # 서킷 브레이커가 Open 상태에서 Half-open 상태로 전환되기 전에 기다리는 시간 waitDurationInOpenState: 20s # Open 상태에서 Half-open 상태로 전환되기 전에 대기하는 시간을 20초로 설정 recordExceptions: # CircuitBreaker가 카운트 할 예외 목록 - java.util.concurrent.TimeoutException - org.springframework.web.client.RestClientException ignoreExceptions: # CircuitBreaker가 카운트 하지 않을 예외 목록 - com.example.exception.CustomBadRequestException # 비즈니스 예외는 무시 instances: myService: baseConfig: default # configs.default 설정을 사용 slidingWindowSize: 3
Fallback
장애가 발생했을 때 대체 응답(Fallback)을 통해 일정한 응답을 보장하고 장애 전파를 막을 수 있다
@Service
public class MyService {
// name은 application.yml에 작성한 인스턴스 이름과 대응됨
@CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
public String myMethod() {
// 외부 서비스 호출
return externalService.call();
}
public String fallbackMethod(Throwable t) {
return "Fallback response";
}
}
Resilience4j Dashboard
Resilience4j Dashboard를 사용하여 서킷 브레이커의 상태를 모니터링할 수 있다
build.gradle
dependencies { implementation 'io.github.resilience4j:resilience4j-micrometer' implementation 'io.micrometer:micrometer-registry-prometheus' implementation 'org.springframework.boot:spring-boot-starter-actuator' }application.yml
management: endpoints: web: exposure: include: prometheus prometheus: metrics: export: enabled: truePrometheus를 통해 수집된 메트릭을 Grafana 대시보드에서 시각화 하며, http://${hostname}:${port}/actuator/prometheus 경로를 통해 대시보드에 접속
Spring Cloud와의 통합
Eureka 등 Spring Cloud의 구성요소와 설정을 통해 통합이 가능하다
application.yml
spring: application: name: my-service cloud: circuitbreaker: resilience4j: enabled: true
LIST
'IT > Spring Boot' 카테고리의 다른 글
| [Spring boot] Spring Cloud 분산 추적 (Micrometer, Zipkin) (0) | 2026.07.03 |
|---|---|
| [Spring boot] Spring Cloud Config (0) | 2026.07.03 |
| [Spring boot] Spring Cloud 로드밸런싱 (0) | 2026.06.30 |
| [Spring boot] Spring Cloud 서비스 디스커버리 (Eureka) (0) | 2026.06.25 |
| [Spring boot] MSA, Spring Cloud 개요 (0) | 2026.06.24 |
