MSA에서 Circuit Breaker Pattern 을 왜 사용할까?

호기성세균·2024년 9월 12일
0

cs

목록 보기
26/29

💡 서킷 브레이커란?

MSA에서는 각 서비스가 서로 다른 서비스와 빈번하게 통신을 주고받는다.
하지만 문제는 각 서비스가 독립적으로 장애를 겪을 수 있다는 점이다.
장애가 발생한 서비스에 계속해서 요청을 보내면 장애가 다른 서비스로 전파될 가능성이 크다.
특히 MSA 환경에서의 장애는 빠르게 확산될 수 있어 시스템 전체의 불안정성을 초래할 수 있다.

❗️ 이러한 상황을 해결하기 위해 등장한 것이 서킷 브레이커 패턴이다.

이 패턴은 장애를 감지하고, 실패한 요청을 차단하여 더 이상의 요청을 보내지 않도록 방지하는 역할을 한다.
서킷 브레이커는 시스템이 장애를 확산시키지 않고, 빠르게 복구할 수 있도록 돕는다.
이를 통해 사용자가 불필요하게 대기하는 시간을 줄이고, 시스템의 안정성을 보장할 수 있다.


💡 장애가 전파되는 이유

장애가 다른 시스템으로 전파된다는 것이 잘 이해가 가지 않을 수도 있다.
MSA에서 서비스 간의 상호 의존성으로 인해 장애가 연쇄적으로 확산될 수 있다.
각 서비스는 서로 호출하며 기능을 제공하므로, 하나의 서비스가 장애를 겪을 때 해당 서비스와 연관된 다른 서비스들도 영향을 받을 수 있다.

📌 장애 전파 예시
서비스 A가 서비스 B를 호출하고, 서비스 B에서 장애가 발생해 응답이 없거나 응답이 매우 느려지면, 서비스 A는 정상적인 처리 시간이 지날 때까지 해당 요청을 대기하게 된다.
이 과정에서 서비스 A의 쓰레드가 응답을 기다리며 차단되고, 지속적으로 이러한 요청이 누적되면 서비스 A의 쓰레드가 고갈되어 더 이상 새로운 요청을 처리할 수 없게 된다.
결국 서비스 A도 장애 상태에 빠지게 되고, 이로 인해 서비스 C, D, E와 같이 서비스 A와 연관된 다른 서비스들에도 장애가 전파될 수 있다.
또한, 장애가 발생한 서비스에 계속해서 요청을 보내는 것은 서비스 복구를 더 어렵게 만든다.
장애 상태에서 지속적인 요청이 들어오면 서비스의 자원이 추가적으로 소모되어 복구가 지연될 수 있다. 서킷 브레이커가 없다면, 장애가 발생한 서비스가 응답하지 않거나 타임아웃이 발생할 때까지 모든 요청이 대기 상태에 머무르게 되어 시스템 자원이 낭비되고, 다른 서비스들까지도 장애 상태에 빠지게 되는 결과를 초래한다.


💡 동작 원리

서킷 브레이커는 전기 회로 차단기처럼 동작하며, 세 가지 상태로 구분된다.

  1. 정상 상태 (Closed): 정상적으로 작동하여 모든 요청이 통과되는 상태
  2. 장애 감지 (Open): 요청 실패율이 일정 임계치를 넘으면 회로가 열려 더 이상 요청이 전달되지 않고, 모든 요청 실패 처리
  3. 부분 복구 테스트 (Half Open): 일정 시간이 지나면 회로가 Half Open 상태가 되며, 일부 요청을 보내어 시스템이 복구되었는지 테스트.
    ❗️ 요청이 성공시 회로가 다시 닫히고, 실패시 다시 Open 상태로 전환

서킷 브레이커는 외부 서비스의 상태를 모니터링하며, 임계치를 초과한 실패가 발생하면 더 이상의 요청을 차단하여 장애 확산을 방지한다. 이후 시스템이 복구되면 요청을 다시 정상적으로 처리하게 된다.


💡 장점 및 필요성

  • 빠른 실패 및 고객 응답: 장애가 발생한 서비스를 신속하게 차단함으로써 시스템은 불필요한 대기 시간을 줄이고, 사용자는 빠르게 실패 응답을 받을 수 있다.
  • 장애 서비스로의 부하 감소: 장애가 발생한 서비스로의 지속적인 요청을 차단하여 복구에 필요한 자원을 보호하고, 장애를 빠르게 해결할 수 있는 기회를 제공한다.
  • 장애 대안 제공: 서킷 브레이커는 장애 상황에서 다른 경로로 데이터를 요청하거나, 캐시된 데이터를 제공하는 등 대안을 제공할 수 있다.
  • 시스템 자원 보호: 장애가 발생한 서비스에 계속해서 요청을 보내면 타임아웃으로 인해 쓰레드나 메모리 자원이 낭비된다. 서킷 브레이커는 이를 방지하여 시스템 자원의 낭비를 막을 수 있다.

💡 단점

서킷 브레이커 패턴은 상태 및 히스토리 관리에 필요한 추가 비용이 발생할 수 있다.
또한 서킷 브레이커가 지나치게 민감하게 설정되면, 장애가 복구된 이후에도 요청이 정상적으로 처리되지 않을 수 있다.


💡 결론

완벽한 시스템은 존재하지 않으며, 서비스 장애는 언제든지 발생할 수 있다.

중요한 것은 장애 발생 시 얼마나 빠르게 대응하고 시스템을 복구할 수 있는지이다.
서킷 브레이커 패턴은 장애 확산을 막고 시스템의 안정성을 유지하는 데 중요한 역할을 한다.
MSA 환경에서는 하나의 서비스 장애가 전체 시스템에 영향을 미칠 수 있기 때문에 서킷 브레이커를 적용함으로써 장애 전파를 차단하고, 복구 후에도 시스템이 정상적으로 작동할 수 있도록 보장한다.

따라서 서킷 브레이커는 서비스 간의 독립성을 유지하고, 장애가 발생하더라도 시스템이 이를 감지하고 회복할 수 있도록 돕는 필수적인 도구이다.

profile
공부...열심히...

0개의 댓글