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

Pooling layer (sampling)

이미지가 있고 이미지에서 filter를 통해 conv layer를 만들었다. 거기에서 한 layer 씩 뽑아내 sampling을 하고 다시 모아 다른 형태로 만들어 넘기는 것을 pooling이라고 한다(size는 변하지만 depth는 변하지 않는다).

 

Max Pooling

Max Pooling 적용후 6, 8, 3, 4가 들어가게 된다.

  • Pooling 기법 중 하나로 여러 개의 값 중 가장 큰 값을 선택하는 방법이다.
  • 4 x 4로 이루어진 output에 2 x 2 filter, stride 2를 적용했으므로 결과는 2 x 2가 된다.
  • Sampling 이라고 부르는 이유는 전체의 값 중 하나를 뽑는 것이기 때문이다.

'Deep Learning' 카테고리의 다른 글

CNN - Convolutional Neural Network  (0) 2019.06.24
ReLu(Rectified Linear Unit)  (0) 2019.06.23

CNN은 고양이가 물체를 인식할 때 감각이 하나씩 깨어나면서 물체를 인식하는 걸 보고 아이디어를 얻었다고 한다.

즉, 이미지 전체를 하나의 입력으로 받는 것이 아니라, 이미지의 일부분 입력으로 받아 처리하는 것을 말한다(filter).

 

빨간색 네모 박스가 filter

  • Filter는 항상 하나의 값을 만들어낸다. 즉, X를 입력 받아 어떤 처리를 한 후 하나의 값을 뽑아낸다.
  • RGB에 해당하는 3은 항상 같아야한다. (만약 1로 지정되어 있다면 한가지 RGB에 해당하는 요소만 처리하겠다는 뜻)
  • W(weight)가 입력이 있을 때 어떤 숫자로 만들어내는 Filter의 값
  • Stride는 필터를 움직이는 단위를 말한다. (Stride가 1일 경우 필터를 1칸씩 움직인다는 뜻)

Filter를 거치면 Output이 나오는 공식

만약 7x7 이미지에 3x3 Filter를 1 Stride를 적용할 경우 5x5가 나오게 된다. (stride가 2라면 3x3 output이 생겨난다.)

이미지 사이즈를 7로 입력했는데 필터를 적용하게 되면 5x5, 3x3 이렇게 이미지가 작아지게 된다. 이미지가 작아질수록 어떤 정보를 잃어버리게 되기 때문에 보통 실제로 CNN을 사용할 때는 Padding을 사용한다.(이미지 손실을 없애기 위함)

 

Padding을 사용하게 되면 원래 이미지와 출력 이미지 사이즈를 같게 해줄 수 있다.

Padding 사용 이유

  • 그림이 급격하게 작아지는 것을 방지하기 위해
  • 이 부분이 모서리다 라는 것을 알려주기 위해
  • 이미지 손실을 최소화 하기 위해

* Padding을 하게 되면 이미지 손실을 막아주지만, 필요 없는 부분인 0이 붙은 만큼 noise가 발생하게 된다.

하지만 데이터 손실보다는 더 나으니 padding을 사용함

6개, 10개의 filter를 사용

필터를 적용해서 만들어진 새로운 출력 결과를 activation map이라고 한다. 각각의 filter의 Weight는 다르기 때문에 나오는 Output은 조금씩 다르다. 그리고 n개의 filter를 적용하게 되면 n개의filter를 사용했기 때문에 depth는 n이 된다.(depth = filter의 개수)

 

Stride가 1일 때 계산 값

(32-5) / 1 + 1 = 28 

(28-5) / 1 + 1 = 24 

 

Weight에 사용된 Variables 수

  • 5 x 5 x 3 x 6
  • 5 x 5 x 6 x 10

 

'Deep Learning' 카테고리의 다른 글

ConvNet Max pooling 과 Full Network  (1) 2019.06.24
ReLu(Rectified Linear Unit)  (0) 2019.06.23

+ Recent posts