-
서킷 브레이커란?MSA & 쿠버네티스(Kubernetes) - k8s 2022. 12. 3. 00:01
개요
소프트웨어 시스템 A, 소프트웨어 시스템 B가 서로 다른 시스템에서 실행 중입니다.
이때 서로 다른 시스템에서 실행 중인 소프트웨어를 원격으로 호출할 수 있는 것은 일반적입니다.
메모리 내 호출과 원격 호출의 가장 큰 차이점 중 하나는 원격 호출이 실패하거나 시간제한에 도달할 때까지 응답 없이 중단될 수 있습니다.
이때 여러 시스템에 걸쳐 연속적인 오류가 발생할 수 있습니다.
네트워크 중 하나가 갑자기 전혀 응답되지 않게 되는 상황이 발생하면 의존성이 있는 서비스까지 연쇄적으로 멈출 가능성이 있습니다.
따라서 이러한 연쇄적인 장애를 막아줄 수 있는 시스템이 서킷 브레이커입니다.
서킷 브레이커 패턴이란?
장애가 특정 임계값에 도달하면 오류와 함께 반환하는 간단한 아이디어입니다.
메서드 호출이 실패할 때 장애가 연쇄적으로 발생하는 것을 방지하고 실패한 서비스를 복구할 수 있는 시간을 제공할 수 있습니다.
timeout이 발생하면 circuit breaker가 이를 가로챕니다.
공식문서 예제
- BookStoreApplication이라는 RestController가 존재한다.
- ReadingApplication이라는 RestController가 존재하고 BookStoreApplication으로부터 값을 받아온 클라이언트에게 반환한다.
- 이때 Bookstore application이 지연되거나 장애가 발생하면 사용자는 500 에러를 받게 됩니다.
이런 상황을 대비하여 Spring Colud는 Circuit Breaker 패턴의 구현을 제공합니다.
문서에서는 resilience4j를 사용한 예제를 보여줍니다.
implementation('org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j') dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } }
이후 CircuitBreaker를 통해 실패 시 반환 값을 지정할 수 있습니다.
@Service public class BookService { private static final Logger LOG = LoggerFactory.getLogger(BookService.class); private final WebClient webClient; private final ReactiveCircuitBreaker readingListCircuitBreaker; public BookService(ReactiveCircuitBreakerFactory circuitBreakerFactory) { this.webClient = WebClient.builder().baseUrl("http://localhost:8090").build(); this.readingListCircuitBreaker = circuitBreakerFactory.create("recommended"); } public Mono<String> readingList() { return readingListCircuitBreaker.run(webClient.get().uri("/recommended").retrieve().bodyToMono(String.class), throwable -> { LOG.warn("Error making request to book service", throwable); return Mono.just("Cloud Native Java (O'Reilly)"); }); } }
이제 Bookstore applicartion이 지연되거나 장애가 발생해도 사용자는 지정된 반환값을 받을 수 있습니다.
참고 자료
https://spring.io/guides/gs/cloud-circuit-breaker/
https://martinfowler.com/bliki/CircuitBreaker.html
'MSA & 쿠버네티스(Kubernetes) - k8s' 카테고리의 다른 글
Docker로 Nginx 정적 파일 서빙 & 리버스 프록시 설정 (0) 2023.03.04 rancher desktop 으로 docker desktop 대체하기 (0) 2023.01.30 Docker compose 사용하기 (0) 2022.09.04 DockerFile과 commit 명령어로 웹서버 이미지 만들기 (0) 2022.08.08 도커 컨테이너 수정하기 (0) 2022.08.03