본문 바로가기
프로그래밍/Spring Cloud

[MSA] Hystrix말고 resilience4j ?

by 사바라다 2021. 12. 10.

안녕하세요. 오늘은 분산 시스템에서 장애 상황을 견딜 수 있게 하는 Hystrix가 maintenance mode에 들어감에 따라 대체로 떠올랐던 resilience4j에 대해서 알아보는 시간을 가져보도록하겠습니다. 이번 시간에는 Hystrix 프로젝트의 현재 상태와 resilience에서 제공하는 것은 어떤것이 있는지에 대해서 알아보고 다음시간에는 spring boot 환경에서 실습을 진행할 수 있도록 하겠습니다.

먼저 Hystirx와 fallback tolerance에 대해서 잘 모르신다면 이전에 제가 올렸던 [MSA] Spring Cloud Hystrix - 개념편 포스팅을 먼저 참고해주시기 바랍니다.

Hystrix의 현재 상태(Status)

Hystirx는 2017년 7월 13일 Version 1.5.13과 2018년 11월 17일 Re-release stable 1.5.11 as 1.5.18 버전을 이후로 더 이상 새로운 release 버전이 나오지 않습니다. 그리고 공식 github repository에도 Hystrix는 더이상 개발상태가 아닌 유지보수 상태(maintenance mode)라고 공식적으로 명시되어있습니다.

공식적으로 이렇게 변경한 이유에 대해서는 제가 이해했을때는 Netflix에서의 내부에서 요구하는 요구사항이 pre-configured settings 보다는 real time performance로 옮겨지고 있으며 이는 resilience4jHystrix 보다 더 잘 충족시켜주기 때문이라고 이해했습니다. 저도 Hystrix를 통해서 MSA에서의 장애상화을 견뎌내는 방법에 대해서 공부했고 직접 직면했으며 해결할 수 있었습니다. 이에 Hystrix 프로젝트에 많은 감사를 드립니다.

Spring Cloud Release Notes

이와 관련되어 Spring Cloud Greenwich.RC1 버전이 나왔을 때 release note에도 관련된 내용이 있었습니다. 그리고 대체할 수 있는 모듈들을 명시하고 있습니다. 그 내용은 아래와 같습니다.

Current Replacement
Hystrix Resilience4j
Hystrix Dashboard / Turbine Micrometer + Monitoring SYstem
Ribbon Spring Cloud Loadbalancer
Zuul 1 Spring Cloud Gateway
Archaius 1 Spring Boot external config + Spring Cloud Config

Resilience4j

Resilience4j는 Netflix Hystirx에서 영감을 받아 만든 경량의 장애를 견디게 해주는 라이브러리입니다. 그러나 Hystrix가 Java 6을 기반으로 했다면 Resilience4j는 Java 8을 기반으로 하고 있으며 functional 기법을 기반으로 하고 있다느 차이가 있습니다. 그리고 소개하고 있는 또 다른 차이점은 Hystrix는 내부에 의존하고 있는 모듈이 Guava, Apache Commons 와 같이 큰 모듈들이 많았는데 Resilience4j는 Java 8에서 함수형 프로그래밍을 위한 모듈인 vavr만을 의존하고 있어서 더 가볍기도합니다.

Resilience4j는 decorators 할 수 있는 functional 모델을 제공합니다. 따라서 Circuit Breaker, Rate Limiter, Retry, Bulkhead를 사용자가 원하는 순서대로 decorator pattern 처럼 감싸는 형태로 사용이 가능합니다.

Resilience4j의 Pattern

Resilience4j에서 장애를 극복하기 위해서 제공하고 있는 대표적인 패턴은 아래와 같습니다. Hystrix에서 제공하는 기능과 크게 다르지 않으며 기본적으로는 이름도 동일합니다.

  • Retry
    • 실패한 실행을 짧은 지연을 가진 후 재시도합니다.
  • Circuit Breaker
    • 실패한 실행에 대해서 또 다른 시도가 들어올 때 바로 실패 처리합니다.
  • Rate Limiter
    • 일정 시간동안 들어올 수 있는 요청을 제한합니다.
  • Time Limiter
    • 실행 되는 시간을 특정 시간을 넘지않도록 제한합니다.
  • Bulkhead
    • 동시에 실행할 수를 제한합니다.
  • Cache
    • 성공적인 실행을 캐시합니다. 다음번에 동일한 요청으로 들어오면 바로 반환합니다.
  • Fallback
    • 실행을 실패(Exception)하는 경우에 대신 실행되게하는 프로세스입니다.

마무리

오늘은 이렇게 Hystrix에서 resilience4j로 변경되는 부분에 대한 히스토리를 함께 알아보는 시간을 가져보았습니다.

감사합니다.

참조

github_Hystrix

github_resilience4j

spring_spring-cloud-greenwich-rc1-available-now

resilience4j_docs

infoq_spring-cloud-hystrix

 

댓글