MSA - 서킷 브레이커

2024. 9. 12. 09:41MSA

2024/09/12

 

서킷 브레이커라는 단어를 한 번 쯤 들어보셨나요?
주식 시장에서 서킷 브레이커는 주가지수의 상하 변동폭이
10%를 넘는 상태가 1분간 지속될 때
매매거래를 잠시 중단시키는 제도입니다.
과열된 회로를 차단한다는 뜻을 담고 있죠.
투자자들에게 잠시 숨돌릴 틈을 줘 이성을 되찾아
매매에 참가하라는 취지가 담겨있습니다.

 

갑자기 왜 뜬금없이 주식얘기가 나오냐고요?
MSA에서도 서킷 브레이커라는 개념이 등장하기 때문입니다.
오늘은 서킷 브레이커에 대해 알아보겠습니다. 

 

 

※  서킷 브레이커(Resilience4j)에 대해 알아보자.

 

   ▶ 서킷 브레이커 개요

       ●  서킷 브레이?
            ○  서킷 브레이커는 마이크로서비스 간의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지하는 패턴
              외부 서비스 호출 실패 시 빠른 실패를 통해 장애를 격리하고, 시스템의 다른 부분에 영향을 주지 않도록 한다.
              상태 변화 : 클로즈드 ➡️ 오픈 ➡️ 하프-오픈

 

 

   ▶  Resilience4j 개요

       ●   Resilience4j?
            ○  Resilience4j는 서킷 브레이커 라이브러리로, 서비스 간의 호출 실패를 감지하고 시스템의 안정성을 유지합니다.
              다양한 서킷 브레이커 기능을 제공하며, 장애 격리 및 빠른 실패를 통해 복원력을 높입니다.

       ●  Resilience4j의 주요 특징

              서킷 브레이커 상태 : 클로즈드, 오픈, 하프-오픈 상태를 통해 호출 실패를 관리

📍 클로즈드(Closed) :
     ▪   기본 상태로, 모든 요청을 통과시킨다.
     ▪   이 상태에서 호출이 실패하면 실패 카운터가 증가한다.
     ▪   실패율이 설정된 임계값(예: 50%)을 초과하면 서킷 브레이커가 오픈 상태로 전환된다.
     ▪   예시: 최근 5번의 호출 중 3번이 실패하여 실패율이 60%에 도달하면 오픈 상태로 전환된다.

📍 오픈(Open) :
     ▪   서킷 브레이커가 오픈 상태로 전환되면 모든 요청을 즉시 실패로 처리한다.
     ▪   이 상태에서 요청이 실패하지 않고 바로 에러 응답을 반환한다.
     ▪   설정된 대기 시간이 지난 후, 서킷 브레이커는 하프-오픈 상태로 전환된다.
     ▪   예시: 서킷 브레이커가 오픈 상태로 전환되고 20초 동안 모든 요청이 차단된다.

📍 하프-오픈(Half-Open) :
     ▪   오픈 상태에서 대기 시간이 지나면 서킷 브레이커는 하프-오픈 상태로 전환된다.
     ▪   하프-오픈 상태에서는 제한된 수의 요청을 허용하여 시스템이 정상 상태로 복구되었는지 확인한다.
     ▪   요청이 성공하면 서킷 브레이커는 클로즈드 상태로 전환된다.
     ▪   요청이 다시 실패하면 서킷 브레이커는 다시 오픈 상태로 전환된다.
     ▪   예시: 하프-오픈 상태에서 3개의 요청을 허용하고, 모두 성공하면 클로즈드 상태로 전환된다.
     ▪   만약 하나라도 실패하면 다시 오픈 상태로 전환된다.


             Fallback : 호출 실패 시 대체 로직을 제공하여 시스템 안정성 확보
             모니터링 : 서킷 브레이커 상태를 모니터링하고 관리할 수 있는 다양한 도구 제공

 

 

   ▶ Resilience4j 설정

       ●  기본 설정

⚠️   resilience4j 의존성은 spring starter에서 추가하여 사용하지 않을 것이다.
        ”io.github.resilience4j:resilience4j-spring-boot3:2.2.0” 를 사용한다.
        ”boot3” 임을 주의 하자❗


            ○  Resilience4j를 사용하려면 Spring Boot 애플리케이션에 의존성을 추가해야 한다.
           📌  build.gradle  파일 예시 : 

dependencies {
    implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
	  implementation 'org.springframework.boot:spring-boot-starter-aop'
}

 

       ●  Resilience4j 설정 파일
              Resilience4j의 설정은  application.yml 파일에서 설정할 수 있다.
           📌 예시 설정 파일 : 

YAML

resilience4j:
  circuitbreaker:
    configs:
      default:  # 기본 구성 이름
        registerHealthIndicator: true  # 애플리케이션의 헬스 체크에 서킷 브레이커 상태를 추가하여 모니터링 가능
        # 서킷 브레이커가 동작할 때 사용할 슬라이딩 윈도우의 타입을 설정
        # COUNT_BASED: 마지막 N번의 호출 결과를 기반으로 상태를 결정
        # TIME_BASED: 마지막 N초 동안의 호출 결과를 기반으로 상태를 결정
        slidingWindowType: COUNT_BASED  # 슬라이딩 윈도우의 타입을 호출 수 기반(COUNT_BASED)으로 설정
        # 슬라이딩 윈도우의 크기를 설정
        # COUNT_BASED일 경우: 최근 N번의 호출을 저장
        # TIME_BASED일 경우: 최근 N초 동안의 호출을 저장
        slidingWindowSize: 5  # 슬라이딩 윈도우의 크기를 5번의 호출로 설정
        minimumNumberOfCalls: 5  # 서킷 브레이커가 동작하기 위해 필요한 최소한의 호출 수를 5로 설정
        slowCallRateThreshold: 100  # 느린 호출의 비율이 이 임계값(100%)을 초과하면 서킷 브레이커가 동작
        slowCallDurationThreshold: 60000  # 느린 호출의 기준 시간(밀리초)으로, 60초 이상 걸리면 느린 호출로 간주
        failureRateThreshold: 50  # 실패율이 이 임계값(50%)을 초과하면 서킷 브레이커가 동작
        permittedNumberOfCallsInHalfOpenState: 3  # 서킷 브레이커가 Half-open 상태에서 허용하는 최대 호출 수를 3으로 설정
        # 서킷 브레이커가 Open 상태에서 Half-open 상태로 전환되기 전에 기다리는 시간
        waitDurationInOpenState: 20s  # Open 상태에서 Half-open 상태로 전환되기 전에 대기하는 시간을 20초로 설정

 

 

   ▶ Fallback 메커니즘

       ●  Fallback 설정
            ○  Fallback 메서드는 외부 서비스 호출이 실패했을 때 대체 로직을 제공하는 메서드다.
           📌 예시 코드 : 

@Service
public class MyService {

    @CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
    public String myMethod() {
        // 외부 서비스 호출
        return externalService.call();
    }

    public String fallbackMethod(Throwable t) {
        return "Fallback response";
    }
}

 

       ●  Fallback의 장점
              시스템의 안정성을 높이고, 장애가 발생해도 사용자에게 일정한 응답을 제공할 수 있다.
              장애가 다른 서비스에 전파되는 것을 방지한다.

 

 

   ▶ Resilience4j Dashboard

       ●  Resilience4j Dashboard 설정
            ○  Resilience4j Dashboard를 사용하여 서킷 브레이커의 상태를 모니터링할 수 있다.
           📌  build.gradle  파일 예시 : 

dependencies {
    implementation 'io.github.resilience4j:resilience4j-micrometer'
    implementation 'io.micrometer:micrometer-registry-prometheus'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

            ○  설정은  application.yml 파일에서 설정할 수 있다.
           📌 예시 코드 :

management:
  endpoints:
    web:
      exposure:
        include: prometheus
  prometheus:
    metrics:
      export:
        enabled: true

            ○  http://${hostname}:${port}/actuator/prometheus 에 접속하여 서킷브레이커 항목 확인이 가능하다.


       ●  Resilience4j Dashboard 사용
            ○  PrometheusGrafana를 사용하여 Resilience4j 서킷 브레이커의 상태를 실시간으로 모니터링할 수 있다.
            ○   Prometheus를 통해 수집된 메트릭을 Grafana 대시보드에서 시각화할 수 있다.

 

 

   ▶ Resilience4j와 Spring Cloud 연동

       ●  Spring Cloud와의 통합
            ○  Resilience4j는 Spring Cloud Netflix 패키지의 일부로, Eureka와 Ribbon 등 다른 Spring Cloud 구성 요소와 쉽게 통합할 수 있다.
              Spring Cloud의 서비스 디스커버리와 로드 밸런싱을 활용하여 더욱 안정적인 마이크로서비스 아키텍처를 구축할 수 있다.
           📌 예시 설정 파일 : 

YAML

spring:
  application:
    name: my-service
  cloud:
    circuitbreaker:
      resilience4j:
        enabled: true