y1551463

서킷 브레이커

CIRCUITBREAKER
a month ago
·
8 min read

서킷 브레이커

  • 시스템 장애의 전파를 방지하고 고가용성을 유지하도록 하는 디자인 패턴이다

    • MSA나 분산 시스템에서 유용하다

  • 서비스가 실패하거나 과부하 상태에 있을 때 해당 서비스를 계속 호출하는 것을 중지하고 시스템이 정상 상태로 복구될 때까지 일정 시간 대기하도록 하는 방식으로 동작한다

서킷 브레이커가 필요한 경우

  1. 서비스 장애로 인한 시스템 과부하 방지

    • MSA 또는 분산 시스템에서는 여러 서비스가 상호 작용을 하는데 이때 만약 하나의 서비스가 다운되거나 느려지면 해당 서비스에 의존하는 다른 서비스들도 영향을 받을 수 있다

      • 서킷 브레이커는 장애가 발생한 서비스에 대한 추가 호출을 차단하여 시스템 전체가 마비되는 것을 방지하고 다른 서비스들이 정상적으로 동작할 수 있도록 한다

  2. 복구 시간 확보

    • 장애가 발생한 서비스에 대해 일정 시간동안 호출을 차단하고 이후 재시도를 통해 서비스의 복구 여부를 확인한다

      • 장애가 있는 서비스를 계속 호출하며 발생하는 리소스 낭비를 방지한다

      • 장애 발생 후 일정 시간 대기, 서비스 복구 여부 점검을 통해 해당 서비스 호출을 다시 시도할 수 있도록한다

  3. 시스템의 응답 시간 개선

    • 장애가 발생한 서비스에 지속적으로 요청을 보낼 경우 시스템 응답이 시간이 길어지거나 타임아웃이 발생할 수 있다

      • 서킷 브레이커를 사용하면 장애가 발생한 서비스에 대한 요청은 차단하고 다른 서비스들에 대한 요청은 정상적으로 응답하여 시스템의 전체적인 응답 시간 개선에 도움을 준다

서킷 브레이커 동작 원리

  1. Closed (닫힘 상태)

    • 정상 상태로 서킷 브레이커는 닫힘 상태이다

    • 해당 상태에서는 서비스 호출이 정상적으로 이루어지며 문제가 발생하는 경우 실패 횟수를 기록하고 일정 횟수를 넘겼을 때 '열림' 상태로 전환된다

  2. Open (열림 상태)

    • 장애가 발생한 서비스에 대해 호출을 더이상 보내지 않도록 차단하는 상태이다

    • 해당 상태에서는 일정 시간동안 장애 발생된 서비스를 호출하지 않고 해당 서비스가 복구될 때까지 대기한다

      • 대기 시간이 지나면 다시 '반열림' 상태로 전환되어 해당 서비스가 복구되었는지 확인한다

  3. Half-Open (반열림 상태)

    • 장애가 발생했던 서비스에 대해 일부 요청을 보내서 해당 서비스가 복구되었는지 확인하는 상태이다

      • 복구되었다면 '닫힘' 상태로 전환하고 지속적으로 문제가 있다면 '열림' 상태로 돌아간다

서킷 브레이커 패턴을 사용하는 기술

  1. Hystrix

    • Netflix에서 만든 Hystrix는 서킷 브레이커 패턴을 구현한 라이브러리이다

    • 장애를 감지하고 시스템의 회복성을 높이는데 도움을 준다

      • 타임아웃 설정, fallback 메커니즘 등을 제공하여 장애가 발생했을 때 대체 경로를 설정할 수 있다

  2. Resilience4j

    • Hystrix의 후속으로 Java에서 사용할 수 있는 서킷브레이커 라이브러리이다

    • Hystrix의 기능을 확장하고 더 가벼운 구현체로서 슬라이딩 윈도우와 같은 기능을 제공한다

서킷 브레이커의 장점

  • 시스템 안정성 증가

    • 장애가 발생한 서비스를 계속 호출하는 것을 방지하여 시스템의 다른 부분에 미치는 영향을 최소화한다

  • 고가용성 유지

    • 장애가 발생한 서비스가 완전히 복구될 때까지 다른 서비스들이 정상적으로 작동할 수 있도록 한다

  • 장애 격리

    • 하나의 서비스 실패가 시스템 전체로 확산되지 않도록 하여 장애를 격리할 수 있다

  • 시스템 자원 절약

    • 서비스 장애에 계속 호출을 보내는 것보다 자원을 절약하여 시스템 성능을 유지할 수 있다

Fallback 메커니즘

  • Fallback은 서킷 브레이커가 '열림' 상태일 때 대체 동작을 정의하는 메커니즘이다

    • 서비스 호출이 실패했을 때 대체할 수 있는 다른 로직이나 데이터를 제공

      • 주로 임시 데이터 반환, 기본값 제공, 캐시 활용 등이 사용된다

  • Fallback은 장애가 발생했을 때 사용자가 대기하거나 실패한 서비스로 인해 큰 피해를 입지 않도록 도와주는 중요한 역할을 한다

Threshold (임계값)

  • 서킷 브레이커는 장애를 감지할 때 특정 기준을 사용하여 활성화된다

    • 해당 기준은 서비스 호출의 실패 횟수, 응답 시간 등을 기준으로 설정할 수 있다


- 컬렉션 아티클