CircuitBreaker는 서비스메시의 쿠버네티스 Istio를 이용해서 인프라 레벨에서 적용가능하나, 이번 포스팅에선 Resilience4j를 이용한 어플리케이션 레벨에서 적용하겠습니다.
Hystrix is no longer in active development, and is currently in maintenance mode.
ext{
resilience4jVersion = '1.7.1'
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-starter-aop')
compile("io.github.resilience4j:resilience4j-spring-boot2:${resilience4jVersion}")
compile("io.github.resilience4j:resilience4j-all:${resilience4jVersion}")
compile("io.github.resilience4j:resilience4j-reactor:${resilience4jVersion}")
}
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState : 10s
instances:
hgsssss:
baseConfig: default
slidingWindowSize
: 서킷브레이커가 닫힌 상태에서 기록할 sliding window 크기 설정failureRateThreshold
: 실패 비율 임계치를 백분율로 설정waitDurationInOpenState
: 서킷브레이커가 Open후 waitDurationInOpenState 시간만큼 지난 후 Half-Open 상태도 전환@Slf4j
@Service
@RequiredArgsConstructor
public class CircuitService {
private final Call call;
private static final String DEFAULT_NAME = "hgsssss";
private static final String FALLBACK_DEFAULT = "helloFallback";
@CircuitBreaker(name = DEFAULT_NAME, fallbackMethod = FALLBACK_DEFAULT)
public Mono<String> getHello(String name){
return call.getApiHello(name);
}
private Mono<String> helloFallback(String name, Throwable t){
log.error("Fallback : "+ t.getMessage());
return Mono.just("fallback data");
}
}
@CircuitBreaker
어노테이션을 작성하여 application.yml에서 선언한 "hgsssss" 인스턴스 명 삽입합니다.서킷브레이커가 닫혀있는 평소 상태
서킷브레이커가 오픈된 상태
failedCalls : 외부 API 호출을 실패하여 fallbackMethod가 실행된 횟수
notPermittedCalls : 메서드 호출은 됐지만 서킷브레이커가 Open된 상태기 때문에 외부 API 호출을 하지 않은 횟수
요즘은 개인 공부보다 회사 서비스를 더 효율적으로 개선하고 관리하는 데에 관심을 두고 있어서 재미있는 나날들을 보내고 있습니다.
각 모듈마다 장애 전파를 막을 수 있기 때문에 분산 서버를 운영한다면 꼭 필요한 기술이라고 생각합니다. 서킷브레이커를 공부하면서 저희팀에도 꼭 필요할 것 같아서, 공부 후에 팀원들에게 공유하고 리뷰해서 추후에 도입하기로 결정하였습니다.
서킷브레이커를 도입하려면 서비스의 외부 API를 호출하는 모든 기능을 정의 후에 어떤 메서드에서 사용하고, 어떠한 fallbackMethod를 구성할지 벌써부터 매우 흥미롭습니다. 아직 프로젝트에 적용해보지 않았기 때문에 실제 프로젝트에 적용 후 시행착오와 매니징 프로세스 구성 후 서킷브레이커를 어떻게 모니터링하고, 어떻게 관리할 지 추가적으로 포스팅할 예정입니다.
제가 맡은 서비스에서도, API 에서 장애가 생기면, MVC 서빙되는 서버도 장애가 나고, DB 에서도 장애가 났던 경험이 있는데요.. CircuitBreaker 를 사용하면 문제점을 보완할 수 있을 것 같네요. 포스팅 감사합니다!