[TIL] Spring Cloud를 활용한 MSA 기초 - 4강 Circuit Breaker – Hystrix

GuruneLee·2020년 10월 5일
1

00. Netflix OSS와 spring cloud

00-0. Netflix OSS

  • 50개 이상의 사내 프로젝트를 오픈소스로 공개
  • 플랫폼(AWS)안의 여러 컴포넌트와 자동화 도구를 사용하면서 파악한 패턴과 해결방법을 블로그, 오픈소스로 공개

00-1. Spring Cloud

  • Spring Cloud란: Cloud Native하게 개발할 수 있는 환경을 spring 기반으로 만든 것

00-2. Netflix OSS와 spring cloud 교집합 => spring-cloud-netflix


01. Hystrix – Circuit Breaker

01-0. 모놀리틱에서의 의존성 호출

: 실패가 없는 100퍼센트 신뢰도의 호출

01-1. MSA환경에서의 의존성 호출

  • 분산 시스템, 특히 클라우드 환경에선 실패(Failure)는 일반적인 표준이다 (Failure as a First Class Citizen)
  • 모놀리틱엔 너어어어무 확률이 적어서 신경 안썼던 장애 유형
  • 한 마이크로 서비스의 가동률(uptime) 최대 99.99%이라고 할 때
    ✔ 30개의 마이크로 서비스가 있다면, 99.99^30 = 99.7% uptime
    ✔ 10억개의 요청 중 0.3% 실패 -> 300만 요청이 실패
    ✔ 모든 서비스들이 이상적인 uptime을 가지고 있어도 매 달 2시간 이상의 downtime이 발생한다는 수학적 예측

01-2. Circuit Breaker – Hystrix

: Latency Tolerance and Fault Tolerance for Distributed Systems (지연감내 및 실패감내)
모든 설정이 기본이라고 가정하고 임베디드 톰켓으로 4개의 서버를 배포했다고 생각해보자

  • 기본 서블릿 쓰레드 값 = 200
  • 기본 Timeout = 무한대 -> 한 번의 요청이 끝나기 전엔 그 쓰레드를 못쓴다는 의미
    ✔ 만일 마지막 서비스가 down되어 버리면, 무한정 대기, 무한정 대기, 200개가 꽉차면 그 앞에게 무한정 대기 무한정 대기 .... 200개가 전부다 대기하고 있으면 down되어 버리는 거임
    ✔ 가용성이 좋은 서비스가 아니게 되어버림....ㅠ

01-3. Hystrix 적용하기

Hystrix 커맨드 적용하기 (annotation 붙이면 됨)

  • 이 restTemplate을 가로채서 대신 실행시킴
  • 결과를 통계를 내서, 조치를 취함

Circuit Breaker!!

  • Circuit Open??
    : Circuit이 오픈된 Method는 (주어진 시간동안) 호출이 ‘제한’되면, ‘즉시’에러를 반환한다
  • Why?
    : 특정 메소드에서의 지연이 시스템 전체의 Resource를 모두 소모하여 시스템 전체의 장애를 유발함
  • So,
    : 장애를 유발하는 (외부) 시스템에 대한 연동을 조기에 차단 (Fail Fast) 시킴으로서 나의 시스템을 보호함
  • 기본 설정,
    : 10초동안 20개 이상의 호출이 발생했을 때, 50% 이상의 호출에서 에러가 발생하면 Circuit을 open함.
    ✔ Circuit이 open된 경우의 에러처리? -> Fallback
    ✔ Fallback method는 Circuit이 오픈된 경우 혹은 Exception이 발생한 경우 대신, 호출될 Method.
    ✔ 장애 발생시 Exception대신 응답할 Default구현을 넣는다

  • 오랫동안 응답이 없는 메소드에 대한 처리 방법은? – Timeout


✔ 설정하지 않으면 default 1000ms
✔ 설정 시간동안 메소드가 긑나지 않으면 Hystrix는 메소드를 실제 실행중인 쓰레드에 interrupt()를 호출하고, 자신은 즉시 HystrixException을 발생시킴
✔ Fallback도 이 때 똑같이 실행될라면 실행 됨


02. 실습

  • 배경
    ✔ Display 서비스는 외부 서버인 Product API와 연동되어 있음
    ✔ Product API에 장애가 나더라도 Display의 다른 서비스는 이상없이 작동되어야 함
    ✔ Product API에 응답 오류인 경우, Default값을 넣어주고 싶다
  • 결정 내용
    ✔ Display -> Product 연동 구간에 Circuit Breaker를 적용해보자

02-0. Hystrix Fallback 적용하기

  1. [display] build.gradle에 hystrix dependency 추가
  2. [display] DisplayApplication에 @EnableCircuitBreaker추가
  3. [display] ProductRemoteServiceImp에 @HystrixCommand추가

02-1. Hystrix Fallback 적용하기

  1. [product] ProdcutController에서 항상 Exception던지게 수정하기 (장애 상황 흉내)
  2. [display] ProductRemoteServiceImp에 Fallback Method 작성하기
  3. 확인
    : Hystrix가 발생한 Exception을 잡아서 Fallback을 실행. Fallback여부와 상관없이 Circuit 오픈 여부 판단을 위한 ‘에러통계’는 계산하고 있음. 아직 Circuit이 오픈된 상태는 X
  4. Fallback원인 출력하기
    : Fallback 메소드의 마지막 파라미터를 ‘Throwable’로 추가하면 Fallback일으킨 Exception을 전달 해줌
  5. 정리
    : Hystrix에서 Fallback의 실행 여부는 Exception이 발생했는가 여부.
    Fallback의 정의 여부는 Circuit Breaker Open과 무관.
    Throwable 파라미터의 추가로 Fallback원인을 파악할 수 있음

02-2. Hystrix로 Timeout처리하기

부터는 ppt 참고하기 (p.66 - p.79) 
profile
Today, I Shoveled AGAIN....

0개의 댓글