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 상태가 된다
- CLOSED
- Special
- DISABLED
- 항상 접근 가능
- FORCED_OPEN
- 항상 접근 불가
- DISABLED
설정: https://resilience4j.readme.io/docs/circuitbreaker#create-and-configure-a-circuitbreaker
Bulkhead
사전적 의미: 격벽 (칸을 만들기 위해 설치한 벽)
호출을 격리하여 장애가 전파되지 않도록 하는 것이 목적으로, 동시 실행 수를 제한한다.
두 가지 격벽 패턴 구현체를 제공한다.
- a SemaphoreBulkhead which uses Semaphores
- 기본적으로 이것을 사용하게 되어 있음
- Semaphore 학습 필요
- 하는 김에 Mutex도
- a FixedThreadPoolBulkhead which uses a bounded queue and a fixed thread pool.
추후 학습
Rate Limiter
한계를 넘어선 초과 요청을 거부하거나 큐에 담아 나중에 실행할 수 있게 한다.
추후 학습
Retry
실패했을 때 자동 재시도
학습 테스트 코드
- https://github.com/venzersiz/learn-spring-resilience4j/commit/599ebfd8e755a96f6f45daefe08a465ad7428100
- Circuit Breaker + Retry: https://github.com/venzersiz/learn-spring-resilience4j/commit/5cce253129946a4225c38cf702d838cb473aaef5
Time Limiter
실행시간 제한 설정
응답시간이 설정 시간을 초과하면 Timeout을 발생시킨다.
추후 학습
Cache
응답결과 캐슁
추후 학습
스프링 부트에 연동
https://resilience4j.readme.io/docs/getting-started-3
예제 코드: https://github.com/resilience4j/resilience4j-spring-boot3-demo
Circuit Breaker
Retry
Circuit Breaker + Retry
참고
- 레퍼런스 한글 번역
- 개념 이해
- Spring Cloud Circuit Breaker