MSA

Hystrix - Circuit Breaker

Beekei 2021. 9. 10. 17:30
반응형

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

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 # 서킷 브레이커가 작동 할 에러 퍼센트를 지정

 

Hystrix! API Gateway를 도와줘! | 우아한형제들 기술블로그

{{item.name}} 들어가기 안녕하세요. 배민FRESH 서비스를 개발하고 있는 조건희입니다. 오늘은 API Gateway를 사용하면서 겪은 뼈아픈(?) 장애 사례와 해결 과정을 간단히 공유하고자 합니다. 너무 자세

techblog.woowahan.com

반응형