Netflix OSS 이야기
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 |
댓글
이 글 공유하기
다른 글
-
git cherry-pick으로 rebase 완성하기
git cherry-pick으로 rebase 완성하기
2022.01.28 -
centOS mirror
centOS mirror
2021.12.16 -
AWS 게임대회 후기
AWS 게임대회 후기
2021.10.07 -
CORS 해결하기
CORS 해결하기
2021.09.01