What is?
- 서비스 호출에서 장애가 발생하면 다른 서비스로 장애가 전파된다.
- 요청이 계속 쌓이다 보면 복구가 어렵다.
- 장애가 발생한 서비스를 탐지하고, 요청을 보내지 않도록 차단하는 디자인 패턴이 Circuit Breaker이다.
Use
dependencies
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'io.github.resilience4j:resilience4j-spring-boot3'
}
- 쉬운 적용을 위해서 aop를 추가적으로 사용하는 것이 좋다.
설정하기
resilience4j.retry.instances.sample-api.maxAttempts=5
resilience4j.retry.instances.sample-api.waitDuration=1s
resilience4j.retry.instances.sample-api.enableExponentialBackoff=true
#resilience4j.circuitbreaker.instances.default.failureRateThreshold=90
resilience4j.ratelimiter.instances.default.limitForPeriod=2
resilience4j.ratelimiter.instances.default.limitRefreshPeriod=10s
resilience4j.bulkhead.instances.default.maxConcurrentCalls=10
resilience4j.bulkhead.instances.sample-api.maxConcurrentCalls=10
- maxAttempts: 재시도 방식의 최대 시도횟수를 정한다.
- waitDuration: 기다리는 시간 설정
- enableExponentialBackoff: 재요청 시간 간격 점차 증가
Code
@RestController
public class CircuitBreakerController {
private Logger logger =
LoggerFactory.getLogger(CircuitBreakerController.class);
@GetMapping("/sample-api")
@Bulkhead(name="sample-api")
public String sampleApi() {
logger.info("Sample api call received");
return "sample-api";
}
public String hardcodedResponse(Exception ex) {
return "fallback-response";
}
}
- @Retry: 오류 발생시 재시작
- @CircuitBreaker: 지정한 실패률 초과시 차단
- @RateLimiter: 초당 허용하는 건수 설정
- @Bulkhead: 동시 호출을 수를 제한하는 방식
- fallbackMethod: 예비로 실행할 함수, 기본 함수와 리턴 값이 같아야한다.