티스토리 뷰

스프링 클라우드가 제공하는 기능 중 Circuilt Breaker라는 기능이 있었다 

이 기능은 어떤일을 하며 해당 기능을 제공해주는 Hystrix를 사용하여 실습을 해보는 시간을 가지도록 하자


장애 연쇄란?

Supplier 서버에 장애가 생겨 타임아웃이 발생할 경우 Client 서버는 타임아웃이 해결될 때까지 응답이 밀리게된다. Supplier 서버의 응답이 밀리는 동안 Client 서버에도 요청이 계속 싸여 Client 서버까지 장애가 발생하는 것을 장애 연쇄라고 한다.

이러한 장애 연쇄 상황이 발생하지 않도록 circuit breaker를 두어 장애 전파를 막을 수 있다

 

나는 스프링 클라우드에서 제공하는 넷플릭스 오픈소스인 Hystrix 라이브러리를 사용하기로 하였다

 

Hystrix의 Circuit Breaker 

  • circuit open  - circuit이 오픈된 메소드는 주어진 시간동안 Supplier 서버에게 호출이 제한되며 즉시 에러를 반환한다

  • 효과 - 장애를 유발하는 외부 시스템(Supplier 서버)에 대한 연동을 조기에 차단시킴으로서 나의 시스템(Client 서버)을 보호할 수 있다

  • 기본 설정 - 10초동안 20개 이상의 호출이 발생 했을 때 50% 이상의 호출에서 에러가 발생하면 circuit open을 하여 해당 메소드가 호출될 때 에러를 반환하도록 한다

Hystrix circuilt breaker flow 

  • circuit health check를 위한 최소한의 요청이 들어왔을 때 

    • CircuitBreakerRequestVolumeThreshold:20 //디폴트

  • 그리고 요청에 대한 오류율이 지정한 오류율을 초과했을 때

    • CircuitBreakerErrorThresholdPercentage:50 //디폴트

  • 회로의 상태는 Closed 에서Open으로 변경된다

  • 회로가 열리게 되면 호출은 실행되지 않고 바로 Fallback Method를 실행한다

  • 일정 시간이 지난 후 

    • CircuitBreakerSleepWindowInMilliseconds: 10 //디폴트

  • 다음의 요청또한 실패된다면 계속 open으로 두고 요청이 성공한다면 closed로 변경되고 해당 작업을 반복


실습해보기 

 

1. 라이브러리 의존성 주입

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
}

 

2. Client 서버의 메인클래스에 @EnableCircuitBreaker 어노테이션 지정 

@SpringBootApplication
@EnableCircuitBreaker
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

 

3.  외부 api 호출이 있는 메소드에 @HystixCommand 어노테이션 지정

    @HystrixCommand(commandKey = "productInfo", fallbackMethod = "getProductInfoFallback")
    public String getProductInfo(String productId) {
        return this.restTemplate.getForObject(url + productId, String.class);
    }

    public String getProductInfoFallback(String productId, Throwable t) {
        System.out.println("t = " + t);
        return "[ this product is sold out ]";
    }
  • CommandKey - 해당 커멘드의 이름 말그대로 commandKey

  • fallbackMethod - Supplier 서버의 응답에 에러(타임 아웃, 익셉션)등이 올 경우 반환하는 에러값

  • fallbackMethod의 인자로 Throwable 을 지정하면 에러의 종류를 확인 할 수 있다

4. application.yml에서 Hystrix 설정

hystrix:
  command:
    productInfo:    # command key. use 'default' for global setting.
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000
      circuitBreaker:
        requestVolumeThreshold: 1   # Minimum number of request to calculate circuit breaker's health. default 20
        errorThresholdPercentage: 50 # Error percentage to open circuit. default 50
  • metrics.rollingStats.timeInMilliseconds : 오류 감시 시간, 기본값 10초

  • circuitBreaker.requestVolumeThreshold : 감시 시간 내 요청 수, 기본값 20

  • circuitBreaker.errorThresholdPercentage : 요청 대비 오류율, 기본값 50

Supplier 서버와 Client 서버를 실행시켜 테스트를 해보면 circult breaker가 잘 작동하는 것을 볼 수 있다

 

방법2 -  자바로 Hystrix 설정하기

class UserResource {
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500")
        },
        threadPoolProperties = {
            @HystrixProperty(name = "coreSize", value = "30"),
            @HystrixProperty(name = "maxQueueSize", value = "101"),
            @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
            @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
            @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"),
            @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440")})
    public User getUserById(String id) {
        return userResource.getUserById(id);
    }
}

마무리

 

Spring MSA란 하나의 애플리케이션이 여러 모듈간의 연동으로 이루어진 아키텍처를 말하며 이러한 분산 시스템의 구축을 도와주는 라이브러리에는 Spring Cloud가 있고 그 중 장애 연쇄를 방지해주는 Hystrix의 Circuit Breaker를 사용하여 응답 장애를 해결하는 방법에 대하여 알아보았다 아주 기초적인 부분이므로 더 깊이 있게 사용하기 위해선 더 공부를 해야겠다고 생각이 들었다 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함