Hystrix

  • Hystrix는 마이크로서비스의 전류차단기(Circuit Breaker) 역할을 하는 오픈소스
  • 문제가 있는 마이크로서비스로의 트래픽을 차단하여 전체서비스가 느려지거나 중단되는것을 미리 방지

Hystrix Command 호출할 때 발생하는 일

  • Exception 한 경우 Fallback 처리 한다. 
  • 메소드 종료가 되지 않으면 504 Timeout Gateway 발생

Hystrix - Circuit Breaker 

  • 일정 비율로 에러가 발생하면 Circuit Open 한다. Circuit Open은 메소드 호출함에도 메서지 바디 내용을 누군가 인터셉터해서 Exception으로 처리해버린다. 
    • 운영관점에서 여러 서버를 운영하는데 하나의 서버가 장애가 발생하면 나머지 서버도 사용하지 못할 정도로 리소스를 많이 잡아먹는다. 차라리 차단해버리는 기능을 의미한다. > 장애 전파를 막는다. 
  • 메소드 호출이 Exception 없이 반환되면 Circuit이 닫힌다. 
  • 결국엔 어떤 일정 수치의 에러가 발생하면 Circuit을 Open 하는것이 핵심이다.
  • Circuit Break > @HystrixCommand를 의미한다.
  • 유즈케이스는 Circuit Breaker를 사용할 때는 CommandKey를 설정하는것이 중요하다. 장애가 발생할 가능성이 있는 서버끼리 그룹핑하여 Circuit Breaker를 Open하여 처리할 수 있기 때문이다.
  • @HystrixCommand(commandKey = "ExtDep1") 
    public String anyMethodWithExternalDependency(){ #상품 추천1 } 
    
    @HystrixCommand(commandKey = "ExtDep1") 
    public String anyMethodWithExternalDependency2(){ #상품 추천2 }
  • 메소드 별로 Circuit Breaker는 장애가 나더라도 모른다. 너무 큰 범위로 잡으면 하나의 메서드 때문에 Circuit Open되어 나머지 메서드는 동작하지 않을 가능성이 농후하다. > 단위를 결정하는 것은 매우 중요하다.

Histrix - Fallback

  • Fallback으로 지정된 메서드는 원본 메서드 대신 실행된다. 
  • Circuit Open 보다는 Exception 으로 Fallback이 발생한다. + Timeout 등 
  • 아래 코드를 보면 fallbackMethod로 recoomendFallback으로 이동하는것을 확인할 수 있다. > 최소한의 응답을 전달할 수 있다. 
  • IF ... Fallback 이 마냥 좋은것이 아니다. > 에러를 감추는것이기 때문에 성능 측정상에 잘못된 지표를 제공할 수 있다. (실제로 Exception이 많이 감춰지게 된다고 합니다.) 
  • @HystrixCommand(commandKey = "ExtDep1", fallbackMethod="recommendFallback")
    public String anyMethodWithExternalDependency(){
    
    }
    //fallback method
    public String recommendFallback(){
    
    }
  • illegalArgumentException (호출 시점), nullPointException (파라미터) 호출하는 주체가 프로그래머한테 알려주는 Exception 이다. 확장시켜서 HystrixBadRequestException를 정의할 때 Caller 가 호출된 시점에서 파라미터, 호출 시점 문제 등  illegalArgumentException, illegalStatusException 해당 exception 으로 Wrapping해서 처리한다.
    • 이것이 왜 중요하냐면, Fallback으로 인한 에러가 감춰지는 통계 지표(Circuit Breaker 통계 지표)에서 빠지게 된다. 서버 측이 아니라 클라이언트 에러라고 보는것이다. > Circuit 이 잘못 Open 되는 케이스를 줄일 수 있다. 
    • Exception을 제대로 정리하고 쓰는것이 중요해진다.

Histrix - Timeout

  • Histrix에서 Circuit Breaker 단위(CommandKey 단위)로 Timeout 설정 할 수 있다. > Default : 1s

Histrix - Isolation 

  • Thread Isolation
    • Semaphore에서 Timeout 이 제 시간에 발생하지 못하는 현상을 해결해준다.
    • Thread Pool 을 지정해서 어느 Thread Pool로 돌지 지정할 수 있다. 
    • 자바의 여러 라이브러리들이 Thread Local에 의존하는 경우가 많다. Thread가 변경되면 Thread Local이 망가지게 된다.
  • Optional) Semaphore Isolation - Circuit Breaker에 Semaphore(숫자값)가 붙어있다. 
    • Circuit Breaker를 사용하는 이유는 특정 서버의 지연이 다른 서버의 지연으로 이어지게 막는것 과 각각의 적정 리소스로 제한하여 특정 임계값 이상으로 들어가게 되면 자동으로 Rejection을 발생시키게 된다. 

Ribbon

  • Netflix가 만든 Software Load Balancer를 내장한 RPC(REST) Library
  • API Caller쪽에 Load Balancer를 내장한다. 기존에 인프라 영역에서 L4, L7 로드밸런서를 Application Level로 처리한 개념이다.
  • Server(Caller) 자동으로 Ribbon Client가 붙게되면 인프라 도움 없이도 다수 서버 목록을 Load Balancing 하게 된다. 
    • Spring Cloud에는 Ribbon 클라이언트가 직접 사용하지 않고, Spring Cloud의 HTTP 이 필요한 요소가 내장되어 있다.
    • Zuul API Gateway 에는 Ribbon이 내장되어 있어서 L4의 역할 없이도 수백대의 서버에 로드밸런싱 수행할 수 있다.
    • RestTemplate (@LoadBalanced) 
      • RestTemplate 인터셉터를 통해서 @LoadBalanced 를 추가해주게 된다. 
      • RestTemplate 해도 알아서 LB를 수행한다. 
    • Ribbon이 기존 LoadBalancer와 다른 점 
      • Programmable 하다. LB를 제어 가능하다. 
      • Ribbon 기반의 인터페이스 구현체를 Netflix OSS가 굉장히 잘 제공하고 있다. 

'IT' 카테고리의 다른 글

git cherry-pick으로 rebase 완성하기  (0) 2022.01.28
centOS mirror  (0) 2021.12.16
AWS 게임대회 후기  (0) 2021.10.07
CORS 해결하기  (0) 2021.09.01
[네트워크] gRPC  (0) 2021.08.06