서킷브레이커 맛보기

·2024년 10월 21일

트래픽이 몰려 부하가 오는 상황과 응답 지연에 대응하기 위해 서킷브레이커를 선택해서 사용했다.

이를 제대로 활용하기 위해 기본적인 내용들만 정리해보려고한다.

Circuit Breaker

circuit breaker 패턴은 장애를 방지하기 위한 패턴으로 장애 발생 지점을 감지하고 실패하는 요청을 계속적으로 보내지 않도록 방지하는 패턴이다. (회로차단기)

회로차단기는 스위치가 open되면 전류가 흐르지못하고 closed되면 전류가 흐릅니다.

이런 원리로 circuit breaker가 동작한다.

circuit breaker는 closed, open, half_open 상태가 존재하여 총 3가지 상태가 있다.

closed는 요청의 실패율이 설정한 실패 임계치보다 낮은 상태이며, 서비스에 정상적으로 모든 요청이 처리된다.

open은 요청의 실패율이 설정한 실패 임계치보다 높은 상태이며, open되면 서비스로 요청을 보내지 않고 즉시 실패처리를 한다.

half_open은 open이후 일정 시간이 지난 상태이며, 이후 요청의 성공 실패에 따라 closed/open상태로 변경된다.

  • 이후 요청이 성공한다면 closed상태가 되어 모든 요청이 정상 처리 상태로 돌아간다.
  • 이후 요청이 실패한다면 다시 open상태가 되어 모든 요청을 즉시 차단한다.

임계치 값을 정할때 2가지 기준으로 요청이 실패했다는 것을 정의 할 수 있다.

  • slow call : 설정한 시간보다 오래 걸린 요청 (지연된 요청)
  • failure call : 요청이 실패하거나 에러 응답을 받은 요청 (실패한 요청)

Resilience4j의 circuit breaker 구현 원리

resilience에선 어떻게 circuit breaker pattern을 구현했을까?

우선 각 호출 결과를 저장하고 집계하는 과정(상태의 변화여부)에서 “슬라이딩 윈도우” 방식을 사용합니다.

resiilence4j의 슬라이딩 윈도우는 시간/개수 기준으로 다음과 같이 나뉜다고 한다.

  • count-based sliding window : 요청 개수 단위로 요청을 저장 및 집계
  • time-based sliding window : 요청 시간 단위로 요청을 저장 및 집계

방식에 따라 슬라이딩 윈도 안에서 정해진 확률보다 높은 확률로 호출에 실패하게 되면 상태를 OPEN으로 변경하고, OPEN 상태에서는 연동된 시스템 호출을 시도하지 않으며, 바로 호출 실패 exception을 발생시키거나 정해진 fallback동작을 수행한다.

OPEN 이후 설정한 시간이 지나면 half_open상태로 변경되며, 호출이 정상화되었는지 다시한번 실패 확률로 확인한다.

정상화되었다고 판단되면 closed상태로 변경되며 아직 정상화되지 못했다고 판단되면 다시 open상태로 되돌아간다.

Fallback

서비스를 차단한 경우 예외를 발생시키는 대신 대비책을 제공하거나 미리 준비된 동작을 실행 하는것을 말한다.

circuit breaker가 open상태인 상황에서 사용자 요청을 에러로 응답하지 않고 성공으로 응답하는 것을 의미한다.

fallback method로 서킷 상태를 알수없다.

bulkhead

응답시 지연되는 서비스에 자원을 모두 소진하지 않도록 스레드 풀을 격리하는 것을 의미한다.

각 서비스에서 호출 할 때의 스레드 격리 환경을 설정하여 장애 전파를 막을 수 있다.

참고로, 서킷 브레이커 구현 라이브러리는 Netflix Hystrix, Resilience4J 2가지가 있는데 Netflix hystrix는 github readme를 보면 추가 개발이 없고 유지보수 모드로 Resilience4j를 선택하게되었다!

참고
https://resilience4j.readme.io/docs/circuitbreaker#count-based-sliding-window

0개의 댓글