resilience4j란?
함수형 프로그래밍을 위해 고안된 내결함성(fault tolerance) 라이브러리입니다. Resilience4j는 Circuit Breaker, Rate Limiter, Retry 또는 Bulkhead 등 서비스 장애 대응을 위한 다양한 기능을 제공하고 있습니다. resilience4j는 java8을 통해 기능 개발 됐으며 함수 인터페이스, 람다 식과 같은 고차 함수를 제공합니다.
지원 버전
1.x: Java 8 이상
2.x: Java 17 이상
핵심 모듈
- resilience4j-circuitbreaker: 회로 차단 (Circuit breaking)
- resilience4j-ratelimiter: 속도 제한 (Rate limiting)
- resilience4j-bulkhead: 격벽 (Bulkheading)
- resilience4j-retry: 자동 재시도(동기화 및 비동기화) (Automatic retrying (sync and async))
- resilience4j-timelimiter: 시간 초과 처리 (Timeout handling)
- resilience4j-cache: 결과 캐싱 (Result caching)
핵심 모듈 중 circuit breaker, ratelimiter, bulkhead에 대한 설명만 작성하겠습니다. 각 라이브러리에 대한 추가 설명이 궁금하신 분들은 resilence4j github을 참고해주시기 바랍니다.
resilience4j-circuitbreaker
Circuit Breaker란?
최근의 Web 및 App의 백엔드 서버 시스템은 여러 개의 서비스가 API나 RPC로 연결된 네트워크로 구성되어 있습니다. 만약 이 네트워크 중 하나가 갑자기 전혀 응답하지 않게 되는 상황이 발생하면 어떻게 될까요? 동작하지 않는 서비스 접속 시 타임아웃될 때까지 차단되어, 의존성이 있는 서비스까지 연쇄적으로 멈출 가능성이 있습니다. 만약 네트워크 전체를 파악하고 있는 사람이 아무도 없다면, 근본적인 원인이 어느 서비스에 있는지를 알아내기까지 시간이 걸리게 됩니다.
우리는 이러한 연쇄적인 장애 발생을 막아야 합니다. 적어도 가장 중요한 기능에 영향이 가지 않도록 해야 하는데, 그러기 위해서는 장애가 발생한 서비스에 대한 접속 차단이 필요합니다.
이 시스템을 자동화한 것이 바로 Circuit Breaker입니다.
Circuit Breaker란, 원격 접속의 성공/실패를 카운트하여 에러율(failure rate)이 임계치를 넘어섰을 때 자동적으로 접속을 차단하는 시스템입니다. Circuit Breaker는 상태 머신(State Machine)으로 나타낼 수 있습니다. 접속 성공과 실패 이벤트가 발생할 때마다 내부 상태를 업데이트하여 자동적으로 장애를 검출하고 복구 여부를 판단합니다.
Circuit Breaker 상태 종류
CLOSED
초기 상태입니다. 모든 접속은 평소와 같이 실행됩니다.
OPEN
에러율이 임계치를 넘어서면 OPEN 상태가 됩니다. 모든 접속은 차단(fail fast)됩니다.
HALF_OPEN
OPEN 후 일정 시간이 지나면 HALF_OPEN 상태가 됩니다. 접속을 시도하여 성공하면 CLOSED, 실패하면 OPEN으로 되돌아갑니다.
resilience4j-ratelimiter
Rate Limit란?
서버는 제공할 수 있는 자원이 한정되어 있기 떄문에 특정 임계치까지만 클라이언트의 요청을 허용하는 정책을 의미합니다. 제한치를 넘어선 요청에 대한 요청을 거부하거나 Queue로 만들어 실행 기능 제공합니다.
resilience4j-bulkhead
Bulkhead란?
동시 요청 수를 제한하는 기법입니다. 요청 수에 도달한 이후 요청에 대해서는 예외처리를 진행합니다.
Resilence4j bulkhead pattern
SemaphoreBulkhead
동시 요청 수를 제한을 두고 요청 수에 도달한 이후 요청에 대해서는 BulkheadFullException이 발생합니다.
FixedThreadPoolBulkhead
시스템 자원과 별도로 thread pool을 설정하고 설정된 thread pool은 서비스를 제공하기 위한 용도로만 사용합니다. 그리고 thread pool과 별도로 waiting queue를 설정할 수 있습니다. 만약 thread pool과 waiting queue 가 full 인 경우 BulkheadFullException이 발생합니다.
resilience4j-timelimiter
TimeLimiter는 future supplier의 time limit을 정하는 API입니다.
결론
Resilience4j는 서비스 장애 대응을 위해 만들어진 오픈 소스 라이브러리입니다. 해당 라이브러리에서는 다양한 기능을 제공합니다.
- resilience4j-circuitbreaker: 회로 차단(Circuit breaking)
- resilience4j-ratelimiter: 속도 제한(Rate limiting)
- resilience4j-bulkhead: 격벽(Bulkheading)
- resilience4j-retry: 자동 재시도(동기화 및 비동기화)(Automatic retrying (sync and async))
- resilience4j-timelimiter: 시간 초과 처리(Timeout handling)
- resilience4j-cache: 결과 캐싱(Result caching)
각 서비스 예시 코드는 다음 글에서 작성해보도록 하겠습니다. 감사합니다.
Reference
https://en.wikipedia.org/wiki/Circuit_breaker
https://github.com/resilience4j/resilience4j
https://cheese10yun.github.io/resilience4j-basic/
https://engineering.linecorp.com/en/blog/circuit-breakers-for-distributed-services
'기타' 카테고리의 다른 글
주니어 개발자가 팀에서 성장하는 방법 - (1) (0) | 2023.06.23 |
---|---|
Github Trending로 보는 최근 핫한 오픈 소스 프로젝트들 (1) | 2023.04.17 |
ChatGPT 제대로 사용하기 (0) | 2023.03.30 |
8 Tips To Grow Your Skills as a Software Engineer (0) | 2023.03.28 |
개발자로 거듭나기 (0) | 2023.03.28 |