Circuit Breaker 패턴 이란 ?
I. 개요
Circuit Breaker 패턴은 소프트웨어 아키텍트이자 마이크로서비스와 관련된 주요 개념들을 소개한 마틴 파울러(Martin Fowler)와 그의 동료 마이클 네이거(Michael Nygard)가 발전시킨 패턴입니다. 이 패턴은 네트워크와 외부 시스템의 의존성이 커지면서 장애가 연쇄적으로 발생할 가능성이 높아지는 상황에서 안정성을 유지하기 위해 소개되었습니다.
마이클 네이거는 그의 저서 **"Release It!"** (2007년 출판)에서 Circuit Breaker 패턴을 구체적으로 설명했습니다. 이 책은 분산 시스템에서 안정성을 높이기 위한 다양한 패턴과 기법들을 다루고 있으며, Circuit Breaker 패턴을 통해 서비스 호출 시 장애 전파를 막고 시스템 전체의 안정성을 유지하는 방법을 제안했습니다.
이후, 마틴 파울러는 자신의 블로그와 여러 글에서 이 개념을 널리 알리며 Circuit Breaker 패턴을 포함한 다양한 디자인 패턴들을 소프트웨어 커뮤니티에 소개했고, 특히 마이크로서비스 아키텍처에서의 안정성 패턴을 설명할 때 이 패턴이 널리 언급되었습니다. 따라서, Circuit Breaker 패턴은 공식적으로 마이클 네이거가 2007년에 출판한 책을 통해 제안되었고, 이후 마틴 파울러가 이를 정리하고 홍보하면서 널리 알려졌다고 보면 됩니다.
그러면 마이크로서비스 아키텍처에서의 Circuit Breaker 패턴의 중요도에 대하여 알아 보겠습니다. 전체적인 시스템 구성이 MSA로 되어 있는 경우, 다른 서비스를 호출하는 상황이 빈번하게 발생을 합니다. 여기서 문제는 각 서버들에 장애가 발생할 수 있다는 점인데, 호출한 다른 서비스에 장애가 발생했다면 장애가 전파되어서, 해당 서비스까지 문제가 발생할 수 있습니다. 또한 장애가 발생한 서버에 계속 요청을 보내는 것은 장애 복구를 힘들게 만들 수 도 있습니다. 그래서 장애가 발생한 서비스를 탐지하고, 요청을 보내지 않도록 차단할 필요가 생기게 되었습니다.
이럴 때 사용하는 것이 Circuit Breaker 패턴입니다. Circuit Breaker 패턴은 문제가 발생한 지점을 감지하고, 실패하는 요청을 계속하지 않도록 방지하는 패턴입니다. 이를 통해서 시스템의 장애 확산을 막고, 장애 복구를 도와주며, 사용자는 불필요하게 대기하지 않아도 됩니다. 즉, Circuit Breaker 패턴은 클라이언트 측면에서 장애를 방지하기 위한 도구로써, 실패할 수 있는 작업을 계속 시도하지 않도록 방지하는 패턴입니다.
II. 동작 원리 및 작동 방식
Circuit breaker 패턴은 소프트웨어 시스템에서 장애 복구와 안정성을 유지하기 위해 사용되는 디자인 패턴입니다. 이 패턴은 원격 서비스 호출 시 반복적인 실패가 발생할 경우, 전체 시스템에 영향을 미치는 것을 방지하기 위해 호출을 차단하는 방식으로 작동합니다. 이름 그대로 전기 회로에서 전류 과부하를 막기 위해 차단기를 사용하는 것에서 유래한 개념입니다.
1. Circuit Breaker 패턴의 주요 동작 원리
Circuit Breaker는 아래 그림과 같이 세 가지 상태로 운영됩니다.
- Closed (닫힘) : 정상적인 상태로, 요청이 성공적으로 수행됩니다. 이 상태에서는 모든 요청이 원격 서비스로 전달됩니다.
- Open (열림) : 실패 횟수가 임계치(threshold)를 넘으면 회로가 열리고, 원격 서비스 호출이 즉시 차단됩니다. 이 상태에서는 새로운 요청이 원격 서비스로 전달되지 않으며, 사용자에게 실패 메시지를 반환할 수 있습니다. Open 상태는 설정된 일정 시간이 지나면 Half-Open 상태로 전환됩니다.
- Half-Open (반열림) : 일정 시간이 지난 후 시스템이 다시 복구되었는지 확인하기 위해 일부 요청을 원격 서비스로 보내는 상태입니다. Half-Open 상태에서 요청이 성공하면 다시 Closed 상태로 전환하고, 실패하면 다시 Open 상태로 돌아갑니다.
2. Circuit Breaker 패턴의 작동 방식
- 1) 서비스에 요청을 보냅니다.
- 2) 요청이 실패하면 실패 횟수를 기록합니다.
- 3) 실패 횟수가 설정된 임계치를 넘어서면 Circuit Breaker는 Open 상태로 전환됩니다.
- 4) 일정 시간이 지나면 Half-Open 상태가 되어 일부 요청을 허용하여 서비스가 복구되었는지 확인합니다.
- 5) 성공적으로 응답이 오면 다시 Closed 상태로 돌아가고, 실패하면 Open 상태로 남아 있습니다.
3. Circuit Breaker 패턴의 장점
- 시스템 안정성 : 장애가 있는 서비스로의 과도한 호출을 방지하여 시스템 전체가 불안정해지는 것을 방지합니다.
- 빠른 복구 : 문제 발생 시 빠르게 감지하고 필요한 조치를 취해 시스템을 더 빨리 복구할 수 있습니다.
- 리소스 관리 : 실패한 서비스 호출을 차단해 시스템 리소스를 효율적으로 관리할 수 있습니다.
4. Circuit Breaker 패턴의 사용 상황
이 패턴은 특히 분산 시스템이나 마이크로서비스 아키텍처에서 외부 서비스에 대한 의존성이 클 때 유용하며, 주로 아래와 같은 상황에서 사용됩니다.
- 네트워크 연결이 불안정한 경우
- 외부 API가 자주 다운되는 경우
- 특정 서비스가 일시적으로 사용 불가능해지는 경우
5. 실제 사례를 통한 이해
1) Cascade Failure
위 그림은, 어떤 작업을 수행하기 위해 서비스A는 서비스B에 통신하고, 서비스B는 서비스C에 통신하고, 서비스C는 서비스D에 통신하는 경우의 상황입니다 . 만일 서비스D에서 장애가 발생한다면, 서비스D로 요청을 보내는 서비스C도 실패하고, 서비스B도 실패하고, 서비스A도 실패하게 됩니다. 이것이 바로 연쇄적 실패(Cascading Failure) 문제입니다.
2) Circuit Breaker Routing
이러한 문제는 서킷 브레이커 라우팅을 통하여 해결 할 수 있습니다. 서킷 브레이커는 기본적으로 일정 기간 동안 특정 작업이 실패한 비율이 과하게 높으면 작업을 수행하지 않고 즉시 에러를 반환합니다. 여기에 더해 서킷 브레이커에서 장애 알림을 발송하거나, 장애 대응 스크립트를 실행하는 등의 작업이 추가 될 수 있습니다.
3) Circuit Breaker Design Pattern Diagram
위에서 마틴 파울러의 블로그 이미지를 기반으로 설명을 한 번 했지만, 중요도가 있는 내용이고, 실 사례 이해라는 측면에서 다른 형태의 그림으로 다시 한번 설명을 합니다. 서킷 브레이커란 간단히 말해서 세 가지 상태 사이를 오가는 유한 상태 기계(finite-state machine)입니다.
- Closed: 외부 서비스와 연결된 상태
- Open: 일정 기간 동안 작업의 실패율이 너무 높아서 외부 서비스와의 연결을 일시적으로 끊은 상태
- Limited Closed(Half Open) : 외부 서비스로의 연결을 제한적으로 시도하는 상태
- a) 기본적으로 서킷 브레이커는 Closed 상태에서 외부 서비스와 통신하며 작업을 수행하고 전체적인 요청 횟수, 성공 횟수, 실패 횟수에 대해 기록을 합니다.
- b) Closed 상태에서 일정 기간 동안의 실패 비율이 너무 높거나, 연속적으로 모든 요청이 실패하는 등의 문제가 발생하면 서킷 브레이커는 Open 상태로 전환됩니다.
- c) Open 상태에서 충분한 시간이 지난 이후 서킷 브레이커는 Limited Closed 상태가 되고, 일정 시간이 지난 후 시스템이 다시 복구되었는지 확인하기 위해 일부 요청을 원격 서비스로 보내는 상태입니다. Limited Closed 상태에서 요청이 성공하면 다시 Closed 상태로 전환하고, 실패하면 다시 Open 상태로 돌아갑니다.
6. 참고자료
1) Circuit Breaker : https://martinfowler.com/bliki/CircuitBreaker.html
2) What is Circuit Breaker Design Pattern? https://digitalvarys.com/what-is-circuit-breaker-design-pattern/