본문 바로가기
Java, Kotlin, Spring

[Java/Spring] Resilience4j - Circuit Breaker (1). 정의

by 댕댕미냉 2023. 2. 11.

Resilience4j

 

Resilience4j - CircuitBreaker (1). 정의

이번 포스트는 스프링에서 활용할 수 있는 서킷브레이커인 Resilience4j Circuit Breaker에 대해 작성되었습니다. 정리하다 보니 내용이 꽤 되는 관계로, 3개의 포스트(정의, 설정, 적용)로 나눠서 작성할 예정입니다. 

 

 

 

Resilience4j ?

Resilience4j는 함수형 프로그래밍을 위해 설계된 가벼운 fault tolerance 라이브러리 입니다. Resilience4j는 Circuit Breaker, Rate Limiter, Retry 또는 Bulkhead를 사용하여 함수형 인터페이스, 람다식, 또는 참조형 메서드를 향상시키는 데코레이터를 제공합니다. 한번에 둘 이상의 데코레이터를 쓸 수 있으며, 필요한 데코레이터만 작동하게 끔 설정할 수 있습니다.

 

※ Resilience4j 2 는 Java 17에서만 작동합니다.

 

 

Circuit Breaker(서킷 브레이커)

Circuit Breaker는 연결의 성공/실패를 카운트하여 실패율이 임계치를 넘어섰을 때 자동적으로 접속을 차단하는 시스템을 말합니다. 다량의 오류가 발생하여 실패율이 임계치를 넘어가게 되면, 해당 시점에 발생하는 모든 호출들은 fallback method를 타게끔 되어있습니다.

 

Siliding Window(슬라이딩 윈도우)

Circuit Breaker는 슬라이딩 윈도우를 통해 호출 결과를 저장하고 집계합니다. 슬라이딩 윈도우의 방식은 총 2가지가 있으며(Count-based, Time-based) 그 중 하나를 선택할 수 있습니다.(기본값은 Count-based)

  • Count-based(default) : 마지막 N개의 호출 결과를 집계합니다.
  • Time-based : 마지막 N초간 일어난 호출 결과를 집계합니다.

카운트 기반 슬라이딩 윈도우는 사이즈 N인 원형 배열로 구현되어 있습니다. 슬라이딩 윈도우는 총 집계를 새로운 결과가 기록될때마다 업데이트합니다. (가장 오래된 결과를 제거)

시간 기반 슬라이딩 윈도우도 마찬가지로 사이즈 N인 원형 배열(buckets)로 구현되어 있습니다. 특정 epoch second 마다 기록된 결과를 새로 업데이트하며 결과를 집계합니다.

 

State Transition(상태 전이)

Resilience4j에서 지원하는 Circuit Breaker는 기본 3가지 상태(CLOSED, OPEN, HALF_OPEN)와 특별한 2가지 상태(DISABLED, FORCED_OPEN)를 통해 성공/실패 상태를 관리합니다.

Circuit Breaker State Transition

 

  • CLOSED → OPEN

실패율이 설정된 임계값(threshold)보다 크거나 같으면 서킷브레이커는 상태를 CLOSED에서 OPEN으로 변경합니다. 기본적으로는 모든 Exception이 실패로 측정되지만, 설정에 따라 특정 exception만 실패로 측정되도록 설정할 수 있습니다.(지정되지 않은 exception은 성공으로 인식되도록 할 수 있습니다.)

느린 호출의 비율이 설정된 임계값보다 크거나 같은 경우에도 서킷브레이커는 상태를 CLOSED에서 OPEN으로 변경합니다.

실패율 & 느린호출 비율의 값은 지정된 최소 호출 횟수 이후부터 측정됩니다.

서킷브레이커는 호출을 거부할 때(State = OPEN), CallNotPermittedException을 발생시킵니다.

 

  • OPEN → HALF_OPEN

서킷브레이커의 상태가 OPEN이 된 후 설정된 시간이 경과했을 때, 서킷브레이커는 상태를 HALF_OPEN으로 변경합니다. HALF_OPEN 상태에서는 지정된 횟수의 호출을 통해 여전히 호출이 불가능한지, 아니면 다시 가능한 지 판단합니다. 만약 실패율(또는 느린호출 비율)이 설정된 임계값보다 크거나 같은 경우, 상태는 다시 OPEN으로 돌아가고, 임계값보다 작다면 CLOSED 상태로 변경됩니다.

 

  • DISABLED & FORCED_OPEN

서킷브레이커는 위의 3가지 기본 상태(CLOSED, OPEN, HALF_OPEN) 이외에 2가지 특별한 상태를 추가로 제공합니다. DISABLED는 항상 접근은 허용하고, FORCED_OPEN은 항상 거부하는 상태를 말합니다. 2가지 특별 상태에서는 어떤 값도 측정되지 않습니다. 해당 상태에서 상태를 변경하고자 한다면, 상태전환을 유도하거나 서킷브레이커를 초기화해야 합니다.

 

 

 

 

2023.02.11 - [Spring] - [Java/Spring] Resilience4j - Circuit Breaker (1). 정의

2023.02.11 - [Spring] - [Java/Spring] Resilience4j - Circuit Breaker (2). 설정

2023.02.13 - [Spring] - [Java/Spring] Resilience4j - Circuit Breaker (3). 적용