Resilience4j 개념

Hyunjun Jang·2021년 8월 1일
2

Resilience4j란?

Resilience4j는 Netflix Hystrix 에서 영감을 얻어 만들어진 라이브러리이다. Java 8 및 함수형 프로그래밍을 위해 설계되었고 라이브러리는 다른 외부 라이브러리 종속성이 없는 Vavr 만 사용하기 때문에 가볍다.

이와 대조적으로 Netflix Hystrix 에는 Guava 및 Apache Commons Configuration과 같은 더 많은 외부 라이브러리 종속성이 있는 Archaius에 대한 컴파일 종속성이 있다.

Resilience4j는 Circuit Breaker, Rate Limiter, Retry or Bulkhead를 사용하여 functional interface, lambda, method reference를 위한 higher-order functions(decorator)를 제공한다.

Netflix Hystrix와 Resilience4j 차이점

  • Netflix Hystrix는 더 이상 개발 중이 아니며 현재 유지 관리 모드에 있다.

    Hystrix의 github에 가보면 README에 위와 같은 내용이 적혀있다. 이제 더 이상 개발되지 않고 maintenance만 하겠다고 되어있고 resilience4j를 사용하기를 추천하고 있다.

  • Hystrix는 외부 API 요청을 HystrixCommand로 wrapping해서 사용해야 한다. 하지만 Resilience4j는 functional interface, lambda, method reference를 위한 higher-order functions(decorator)를 제공한다.

    Resilience4j는 어떤 decorator를 사용할지 혹은 사용하지 않을지 선택할 수 있게 된다.

  • Hystrix는 기본적으로 10개의 1-second window buckets에 실행 결과를 저장하고, bucket 하나가 끝나면 새로운 bucket을 만들고 기존 bucket은 없앤다. Resilience4j는 Ring Bit Buffer에 결과를 저장하고 성공한 요청은 0 bit로 실패한 요청은 1 bit로 저장한다. Ring Bit Buffer는 설정으로 조절 가능한 fixed-size를 갖고, long[] array에 bits를 저장한다.

    time winodw가 지났다고 실행 결과를 제거하지 않기 때문에 frequency가 낮든 높든 별다른 설정없이 CircuitBreaker를 이용할 수 있다.

핵심 모듈

  • resilience4j-circuitbreaker: Circuitbreaker

    CircuitBreaker instance를 만들고 없애는 관리를 할 수 있는 class이다. 기본적으로 ConcurrentHashMap을 활용한 in-memory CircuitBreakerRegistry를 제공한다.

  • resilience4j-ratelimiter: Rate limiting

    CircuitBreaker와 비슷한 API를 가지고 있다.
    In-memory RateLimiterRegistry를 제공하고 RateLimiterConfig로 설정할 수 있다.

  • resilience4j-bulkhead: Bulkheading

    Hystrix와 다른 점은 Hystrix는 각각의 dependecy 마다 Thread pool을 주고 Thread Pool size만큼 execution을 제한하고 있다면 resilience4j-bulkhead는 maxConcurrentCalls을 semaphore의 permits 값으로 주고 semaphore를 이용해 제한한다.
    다른 구현 모듈과 비슷하게 In-memory BulkheadRegistry를 제공한다.

  • resilience4j-retry: Automatic retrying (sync and async)

    Retry는 Registry는 따로 없고 Retry retry = Retry.ofDefaults("id"); 이런 식으로 생성한다.

  • resilience4j-cache: Result caching

    resilience4j-cache는 javax.cache.Cache를 wrapping해서 사용한다. javax.cache.Cache instance를 만들고 그 instance를 io.github.resilience4j.cache.Cache로 wrapping한다.

  • resilience4j-timelimiter: Timeout handling

    TimeLimiter는 future supplier의 time limit을 정하는 API이다.

  • 자세한 설명은 resilience4j 참고

Reference

github.resilience4j
spring-cloud-circuitbreaker
Resilience4j란

profile
Let's grow together😊

0개의 댓글