서킷 브레이커 패턴(Circuit Braker Pattern) 요약

|

서킷 브레이커 패턴이란

서킷 브레이커 패턴의 주요 목적은 장애가 발생한 시스템 혹은 서비스에 대한 요청을 일시적으로 중단시켜, 해당 시스템이나 서비스가 회복될 시간을 제공하고, 시스템의 안정성과 가용성을 유지합니다.

특히나 전체적인 시스템 구성이 MSA 로 되어있다면 다른 서비스를 호출하는 경우가 매우 빈번합니다. 문제는 서버들에게 장애가 발생할 수 있다는 점인데, 호출한 다른 서비스에 장애가 발생했다면 장애가 전파되어, 해당 서비스까지 문제가 발생할 수 있습니다.

또한 장애가 발생한 서버에 계속 요청을 보내게 되면 장애 복구를 힘들게 만듭니다. 그래서 장애가 발생한 서비스를 탐지하고, 요청을 보내지 않도록 차단할 필요가 생기게 되었으며

핵심 설명

서킷 브레이커 패턴은 문제가 발생한 지점을 감지하고 실패하는 요청을 계속하지 않도록 방지합니다. 이를 통해 시스템의 장애 확산을 막고, 장애 복구를 도와주며 사용자는 불필요하게 대기하지 않게 됩니다.

  • 클라이언트 측면에서 장애를 방지하기 위한 도구
  • 실패할 수 있는 작업을 계속 시도하지 않도록 방지

실제 회로 차단기와 비교

전구에 문제가 생겨서 계속하여 전류가 흐르면 위험한 상황이라면 전구에 과부하가 걸려 문제가 생길 수 있습니다.

여기서 등장하는 회로 차단기는 자동으로 회로를 열고 전류가 흐르지 않도록 차단합니다.
한 예로 노트북에 과전압이 들어올 때 회로를 차단하여 보호한다 생각하시면 좋습니다.
보호가 안되면 보드가 고장나고 불이 날겁니다.

이제 우리는 전구전원다음과 같이 정의하겠습니다.

  • 전구 : 외부 API (Callee)
  • 전원 : 클라이언트 (Caller | 다른 서버를 호출하는 서버)

3가지 상태로 분류

개방(Closed)차단(Open)일부 차단(Half Open)
상황모든 것이 정상외부(Callee)에
장애가 발생
Open 상태가 되고
일정 시간이 지남
요청Open 상태가 되고
일정 시간이 지남
외부(Callee)
요청을 차단 후
바로 에러를 받음
외부(Callee) 요청을
차단하고 바로 에러를 받음
상태 전이외부(Callee)
요청을 차단
바로 에러를 받음
특정 시간이 지나면
Half Open 상태가 됨
허용 요청에 따라 변경
성공 : Closed
실패 : Open

그림과 함께 표를 확인해보시면 감이 금방 오실겁니다.

  • 개방 : 문제가 없으면 서킷 브레이커 Closed!
  • 차단 : 문제가 발생하면 서킷 브레이커 Open!
  • 일부 차단 : 차단 후 시간 지나면 잘 되는지 찔러보기!

외부 장애 발생 판단법

여기서 외부에 장애가 발생했는지 판단하는 기준은 다음과 같습니다.

  • slow call : 기준 시간보다 오래 걸렸을 때
  • failure call : 실패하고나 오류를 응답받았을 때

이를 통해 규칙을 만들어봅시다

  • 특정 요청이 3번 연속 실패할 경우 요청을 차단
  • 특정 요청이 5번 연속 n초 이상 시간초과 할 경우 요청을 차단
  • 차단했던 요청이 3번 연속 성공할 경우 요청을 전송

서킷브레이커 동작 방식 예시

자 이제 정리 시간입니다. 위의 내용의 반복입니다. 서킷 브레이커를 회로라고 하겠습니다.

  1. 일반적으로 외부 서버는 정상 실행되기 때문에 회로가 닫혀있음
  2. 외부 서버에서 장애 발생
  3. 요청이 계속하여 실패, 회로는 Open 상태가 됨
  4. 이후의 요청들은 더이상 전달되지 않고 차단, 빠르게 에러 또는 실패 응답을 반환
  5. 이후 외부 서버가 정상적으로 복구
  6. 회로가 Open 상태에서 시간이 지나고 Half Open 상태로 변경
  7. 일부 요청들이 외부 서버로 전달되고, 응답에 성공하여 Close 상태로 변경
  8. 모든 요청들이 정상적으로 전달

필요한 이유

  • 장애 감지 및 격리
  • 자동 시스템 복구
  • 빠른 실패 및 고객 응답
  • 장애 서비스로의 부하 감소
  • 장애 대안 커스터마이징

특히나 에러가 나는 것을 API 호출하는 것 또한 서비스에는 부담이 될 수 있는데, 이는 요청하는 서버 또한 대기해야 할 수 있기 때문에 부하를 증가시키는 문제를 야기합니다.

라이브러리는 어떤게 있을까

자바 진영

Reslience4J 사용을 권장합니다. 넷플릭스에서 만든 Hystrix 가 있지만 Deprecated 되었습니다.

PHP 진영

ganesha 가 있습니다

참조

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다