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는 더 이상 개발 중이 아니며 현재 유지 관리 모드에 있다.
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 참고
github.resilience4j
spring-cloud-circuitbreaker
Resilience4j란