반응형
Hystrix 란?
서킷브레이커 즉 회로차단기는 전기 기기에서 과부하나 과전류가 들어왔을때 메인 기기를 보호하기 위한 흔히 쓰는 회로 차단기를 말한다.
MSA에서 서킷 브레이커는 특정 MSA 서비스의 장애로 인해 다른 MSA 서비스에도 장애를 일으킬 수 있는 가능성을 방지하기 위해 사용
Hystrix의 대표 기능
- Thread timeout, 장애 대응 등을 설정해 장애 시 정해진 루트를 따르도록 할 수 있다.
- 미리 정해진 임계치를 넘으면 장애가 있는 로직을 실행하지 않고 우회 하도록 할 수 있다.
사용법
1. Hystrix Dependency 추가
ServiceA build.gradle
dependencies {
...
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
}
2. Main Application에 @EnableCircuitBreaker 어노테이션 추가
serviceA main class
@EnableCircuitBreaker
@SpringBootApplication
public class ServiceAApplication {
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class);
}
}
3. Circuit Break를 추가하고자 하는 메소드에 @HistrixCommand 어노테이션 추가
어노테이션
@HystrixCommand
- 실행된 결과의 성공/실패 여부를 기록하고 Hystrix 서버에 통계 표시
- 실행 결과 통계(설정된 임계치)에 따라 Circuit Open을 판단하고 미리 정해진 Exception 룰을 따르도록 함
- Hystrix Circuit Open 기본 값은 : 10초 동안 20개 이상의 호출이 발생했을때 50%이상의 호출에서 에러가 발생했을 때 작동하도록 설정되어 있음
ServiceA ServiceBRemoteServiceImpl
@Override
@HystrixCommand(commandKey = "getServiceBInfo")
public String getServiceBInfo(String serviceBId) {
return this.restTemplate.getForObject(url + serviceBId, String.class);
}
@HystrixProperty
- @HystrixProperty는 HystrixCommand를 실행시킬때 Hystrix를 구동할 조건을 입력하는 프로퍼티
- 속성값
- execution.isolation.thread.timeoutInMilliseconds
- Histrix가 적용된 메서드의 타임아웃 지정
- 이 타임아웃 내에 메서드가 완료되지 못하면 서킷브레이터가 닫혔있다고 해도 fallback 메서드가 호출됨
- 보통 외부 API 호출 시 RestTemplate와 같은 http client에도 connect, read timeout 등을 지정하게 되는데 Hystrix timeout은 이를 포함하고 여유를 좀 더 두어 잡는게 유리
- MSA에서는 모든 메서드에 타임아웃을 지정하는 것이 좋다.
- 기본값 1초(1000ms)
- metrics.rollingStats.timeInMilliseconds
- "10초간 50% 실패하면 서킷 브레이커 작동"이라는 조건이 정의되어 있다면 여기서 10초를 입력되어 있다는 뜻
- 기본값 10초(10000ms)
- circuitBreaker.errorThresholdPercentage
- 서킷 브레이커가 작동 할 에러 퍼센트를 지정
- 기본값 50%
- circuitBreaker.requestVolumeThreshold
- 서킷 브레이커가 열리기 위한 최소 요청 조건
- 즉 이 값이 20으로 설정되어 있다면 10초간 19개의 요청이 들어와서 19개가 전부 실패하더라도 서킷 브레이커는 열리지 않는다.
- 기본값 20
- circuitBreaker.sleepWindowInMilliseconds
- 서킷 브레이커가 열렸을때 얼마나 지속될지 설정
- 5초로 설정 시 5초 후 서킷 브레이커는 다시 카운트 1부터 시작
- 기본값 5초(5000ms)
- coreSize
- Hystrix를 Thread 방식으로 사용할때 code size를 지정
- 넷플릭스 공식 가이드에 의하면 Thread 방식을 권고
- 기본값 10
- execution.isolation.thread.timeoutInMilliseconds
ServiceA ServiceBRemoteServiceImpl
// commandKey를 이용해 Hystrix에 대한 속성을 여러 개 설정하고자 할 때 각 속성별로 그룹을 지어 다른 속성을 부여할 수 있다.
@HystrixCommand(commandKey = "getServiceBInfo", fallbackMethod = "getServiceBInfoFallback",
commandProperties = {
@HystrixProperty(nane = "execution.isolation.thread.timeoutInMilliseconds", value="2000")
}
}
public String getServiceBInfo(String serviceBId, Throwable t) {
return this.restTemplate.getForObject(url + serviceBId, String.class);
}
// fallback method 구현
public String getServiceBInfoFallback(Throwable t) {
// Throwable 파라메터 추가로 어떤 에러가 발생하였는지 알 수 있다.
System.out.println("Throwable = " + t);
return "Do your fall back process";
}
- execution.isolation.thread.timeoutInMilliseconds 옵션은 @HystrixProperty 어노테이션이 붙은 메소드의 Thread Timeout을 설정하는 프로퍼티
- 기본값음 1000ms이며 예제에서는 2000ms(2초)로 기본값을 변경하였다.
- 2초안에 메소드가 완료되지 않는다면 설정된 예외(Fallback)를 처리하게 된다.
설정 변경
Hystrix는 Thread Timeout milliseconds등에 대한 기본값이 설정되어 있다.
프로젝트 성격이나 애플리케이션의 성격에 따라 해당 값에 대한 수정이 필요
hystrix:
command:
default: # 모든 hystrix command 기본값으로 설정된다.
execution:
isolation:
thread:
timeoutInMilliseconds: 2000
getServiceBInfo: # getServiceBInfo 커맨드키가 설정된 메서드에 설정값으로 설정된다.
execution:
isolation:
thread:
timeoutInMilliseconds: 3000 # commandKey설정을 통해 HystirxCommand의 Property를 속성파일에서 변경 할 수 있다.
circuitBreaker:
requestVolumeThreshold: 20 # 서킷 브레이커가 열리기 위한 최소 요청 조건
errorThresholdPercentage: 50 # 서킷 브레이커가 작동 할 에러 퍼센트를 지정
반응형
'MSA' 카테고리의 다른 글
Eureka - Service Discovery (0) | 2021.09.10 |
---|---|
Ribbon - Client LoadBalancer (0) | 2021.09.10 |
Twelve-Factors (0) | 2021.09.10 |
Cloud Native (0) | 2021.09.10 |
MSA(Microservice Architecture) (0) | 2021.09.10 |