Spring/Fault Tolerance

resillience4j

Krevis 2023. 12. 12. 11:27

 

https://resilience4j.readme.io/

 

resilience: (충격·부상 등에서의) 회복력

한 줄 소개

A fault tolerance library for Java

Modules

Core modules

  • Circuit Breaker
  • Bulkhead
  • Rate Limiter
  • Retry
  • Time Limiter
  • Cache

Circuit Breaker

https://resilience4j.readme.io/docs/circuitbreaker

 

사전적 의미: https://namu.wiki/w/%EC%84%9C%ED%82%B7%EB%B8%8C%EB%A0%88%EC%9D%B4%EC%BB%A4

 

클라이언트 - 서버 A - 서버 B - 서버 C

 

위와 같은 연쇄적인 HTTP 호출이 있을 때, 서버 C에서 장애 발생 시 앞선 모든 클라이언트가 되는 곳은 Blocking된다.

장애가 빨리 해결된다면 문제가 없지만, 지속된다면 서버 C의 장애임에도 불구하고 모든 곳으로 장애가 전파된다.

 

이를 해결하기 위한 가장 간단한 방법은 장애 전파 시간을 줄이기 위해 Timeout 시간을 작게 설정하는 것이다.

서킷 브레이커는 좀 더 진보된 해결 방법이다.

 

원격 호출의 성공/실패를 Counting하여 Failure rate(실패율)가 Threshold(임계치)에 다달으면 차단기가 올라간다.

 

5개의 상태를 가진다.

  • Normal
    • CLOSED
      • 서킷 브레이커가 닫힘
      • 정상적인 서비스 상태를 말한다
    • OPEN
      • 서킷 브레이커가 열림
      • 장애 상태
    • HALF_OPEN
      • OPEN 상태 후 장애가 해결되고 타임아웃이 되면 HALF_OPEN 상태가 된다
      • 이때 서비스 호출이 성공하면 CLOSED로, 그렇지 않으면 OPEN 상태가 된다
  • Special
    • DISABLED
      • 항상 접근 가능
    • FORCED_OPEN
      • 항상 접근 불가

설정: https://resilience4j.readme.io/docs/circuitbreaker#create-and-configure-a-circuitbreaker

 

학습 테스트 코드: https://github.com/venzersiz/learn-spring-resilience4j/commit/4c5563cdee85c9fd0451f4117ae949851630549a

 

Bulkhead

사전적 의미: 격벽 (칸을 만들기 위해 설치한 벽)

 

호출을 격리하여 장애가 전파되지 않도록 하는 것이 목적으로, 동시 실행 수를 제한한다.

 

두 가지 격벽 패턴 구현체를 제공한다.

  • a SemaphoreBulkhead which uses Semaphores
    • 기본적으로 이것을 사용하게 되어 있음
    • Semaphore 학습 필요
      • 하는 김에 Mutex도
  • a FixedThreadPoolBulkhead which uses a bounded queue and a fixed thread pool.

 

추후 학습

 

Rate Limiter

한계를 넘어선 초과 요청을 거부하거나 큐에 담아 나중에 실행할 수 있게 한다.

 

추후 학습

 

Retry

실패했을 때 자동 재시도

 

 

학습 테스트 코드

 

Time Limiter

실행시간 제한 설정

응답시간이 설정 시간을 초과하면 Timeout을 발생시킨다.

 

추후 학습

 

Cache

응답결과 캐슁

 

추후 학습

 

스프링 부트에 연동

https://resilience4j.readme.io/docs/getting-started-3

 

예제 코드: https://github.com/resilience4j/resilience4j-spring-boot3-demo

Circuit Breaker

학습 테스트 코드: https://github.com/venzersiz/learn-spring-resilience4j/commit/14a760341f7977c94ac0ad8403f9ef23d7f0a856

 

Retry

학습 테스트 코드: https://github.com/venzersiz/learn-spring-resilience4j/commit/48d579c36c95c9976bfa577d5f065938120c9c5f

 

Circuit Breaker + Retry

학습 테스트 코드: https://github.com/venzersiz/learn-spring-resilience4j/commit/b00c62550ae7cf2ecdb7f2ea37aa2803daa840e1

 

참고