...
- 정리
Info icon false - Circuit Open 여부는 통계를 기반으로 한다.
- 최근 10초간 호출 통계
- metrics.rollingStats.timeInMilliseconds : 10000
- 최소 요청 갯수(20) 넘는 경우만
- circuitBreaker.requestVolumeThreshold : 20
- 에러 비율 넘는 경우(50%)
- circuitBreaker.errorThresholdPercentage : 50
- 한번 Circuit이 오픈되면 5초간 호출이 차단되며, 5초 경과후 단 “1개”의 호출을 허용하며 (Half-Open), 이것이 성공하면 Circuit을 다시 CLOSE하고, 여전히 실패하면 Open이 5초 연장된다.
- circuitBreaker.sleepWindowInMilliseconds : 5000
- Circuit Breaker의 단위 ?
- 에러 비율을 통계의 단위
- Circuit Open / Close가 함께 적용되는 단위
- 즉, A 메소드와 B 메소드가 같은 Circuit Breaker를 사용한다면, A와 B의 에러 비율이 함께 통계내어지고, Circuit이 오픈되면 함께 차단된다.
- Circuit의 지정은 ?
- 'commandKey' 라는 프로퍼티로 지정 가능.
- @HystrixCommand에서는 지정하지 않는 경우 메소드 이름 사용
- 이렇게 사용하지 말것 !
- 메소드 이름은 겹칠 수 있으며, 나중에 나오는 Feign의 경우 또 다르기 때문에 헷갈 릴 수 있다.
- 항상 직접 지정 해서 사용하기
05. Hystrix Circuit Open commandKey 부여하기
Code Block |
---|
git checkout tags/step-2-hystrix-command-key -b step-2-hystrix-command-key |
- [display] 'commandKey' 부여하기
Code Block @Service public class ProductRemoteServiceImpl implements ProductRemoteService { private static final String url = "http://localhost:8082/products/"; private final RestTemplate restTemplate; public ProductRemoteServiceImpl(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @Override @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 ]"; } }
- [display] application.yml에 commandKey로 속성 지정해보기
Code Block 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