Hystrix

  • Hystirx는 Netflix에서 만든 마이크로 서비스 아키텍처에서 장애 전파방지 & Resilience 를 위한 라이브러리
  • Hystirx의 주요 4가지 기능
    • Circuit Breaker
    • Fallback
    • Thread Isolation
    • Timeout

Hystrix Command를 호출할 때 벌어지는 일

  1. 실행 메소드를 Intercept 하여 대신 실행한다.
    • Thread Isolation
      • 제가 제 메소드를 호출했는데도 디버그를 찍어보면 쓰레드가 변경되는 걸 볼 수 있다 -> 누군가 가로채서 실행한다
  2. 메소드의 실행 결과 혹은 실패 발생 여부를 기록(인스턴스 단위)하고 통계를 낸다. 통계에 따라 Circuit Open 여부를 결졍한다.
    • Circuit Breaker
  3. 실패한 경우 사용자가 제공한 메소드를 대신 실행한다.
    • Fallback
  4. 특정시간 동안 메소드가 종료되지 않은 경우 Exception을 발생시킨다.
    • Timeout(서비스 레이어에 걸기 적당하다)

Circuit Open(호출차단)

  • 메소드를 호출하지만 디버그로 찍어보면 메소드 바디안에 들어오지 않는다.
  • 즉, 누군가 가로채서 바로 Exception으로 보내버리는 것
  • A가  B, C, D를 호출하는데 B가 장애가 발생할 경우 B를 차단해 버리므로 장애가 전파되지 않는 차단기 역할

Circuit Close(호출허용)

  • 설정된 시간 이후 단 한개의 요청에 대해 호출을 허용하며 이 호출이 성공하면 Circuit Close

Circuit Breaker의 단위

  • Circuit Breaker 인스턴스는 함꼐 통계를 내고 함께 차단한다. 즉, Circuit Breaker 는 CommandKey 단위로 생성된다.
  • 만약, Command Key를 주지 않으면 Annotation이 박혀있는 메소드 별로 Circuit Breaker가 생성되어 모든 메소드가 Circuit Breaker 를 가지게 된다.

* 너무 작은 단위로 Circuit Breaker를 생성할 경우 메소드가 n초에 m번 이상 호출이 안될 가능성이 높다. 따라서 50, 60 퍼 확률로 장애가 발생하더라도 동작을 안할 수 있으니 주의.

 

Hystrix - Fallback(@HystrixCommand( commandKey = "Ex1", fallbackMethod="exampleFallBack")

Fallback으로 지정된 메소드는 다음의 경우에 원본 대신 실행된다. (정상동작하지 않을 경우 실행)

  • Circuit Open
  • Any Exception(HystrixBadRequestException 제외)
  • Semaphore / ThreadPool Rejection
  • Timeout

* HystrixBadRequestException

해당 에러 발생시 FallBack을 실행하지 않으며 Circuit Open을 위한 통계에도 집계되지 않는다.

로직을 호출한 Caller가 잘못한 것일 때 이 Exception으로 Mapping 해야한다.(ex. Parameter 잘못 넘김, 잘못된 시점에 호출 - 자바에서는 illegalArgument, illegalstateexception)

 

Hystrix - Timeout

Circuit Breaker 단위로 Timeout을 설정할 수 있다.

 

Hystrix - Isolation

특정 시스템에 지연이 일어나 전체가 망가지는 것을 막기 위해서 뒷단 시스템에 적정 용량을 제한함으로써 과도한 Request가 들어가려고 할 때 자동으로 Rejection을 발생시킨다.

  • Semaphore
    • Circuit Breaker마다 Semaphore가 붙어있다.
      • 연동 시스템이 3개가 있을 때 Circuit Breaker를 3개 지정하고 Semaphore Isolation이라고 지정했다면, 뒤 연동 시스템에 최대 동시 호출 갯수를 지정할 수 있는 것.
    • Caller Thread와 실제 메소드가 실행되는 스레드가 같다. (Command를 호출한 Caller Thread에서 메소드 실행)
  • Thread(default)
    • Thread Pool이기 때문에 Semaphore와 동일하게 최대 요청 개수가 제한되어있다.
    • Semaphore와는 다르게 Caller 스레드와 실제 메소드를 실행할 Thread가 분리 되어서 특정 시간이 지나게 되면 Caller 스레드(사용자에게 응답을 줘야하는 스레드)는 바로 Return 된다.

*Semaphore isolation의 경우 Timeout이 제 시간에 발생하지 못할 수 있다.

이유 : 다른 스레드를 임의로 중단시킬 방법은 없다. 유일한 방법은 Thread.Interrupt를 호출하는 것인데 그것도 실제 실행하는 로직에  Thread.Interrupt가 인식하도록 구현되어 있어야 한다.

따라서, Hystrix에서도 Timeout이 지났다고 복잡한 loop를 돌고 있는데 중단하라고 명령을 내려서 중단시킬 방법은 없다.

 

 

 

 

'Spring' 카테고리의 다른 글

Springboot ribbon 적용하기  (1) 2020.03.03
SpringBoot Hystrix 적용하기  (0) 2020.03.01

+ Recent posts