MSA에서는 각 서비스가 서로 다른 서비스와 빈번하게 통신을 주고받는다.
하지만 문제는 각 서비스가 독립적으로 장애를 겪을 수 있다는 점이다.
장애가 발생한 서비스에 계속해서 요청을 보내면 장애가 다른 서비스로 전파될 가능성이 크다.
특히 MSA 환경에서의 장애는 빠르게 확산될 수 있어 시스템 전체의 불안정성을 초래할 수 있다.
❗️ 이러한 상황을 해결하기 위해 등장한 것이 서킷 브레이커 패턴이다.
이 패턴은 장애를 감지하고, 실패한 요청을 차단하여 더 이상의 요청을 보내지 않도록 방지하는 역할을 한다.
서킷 브레이커는 시스템이 장애를 확산시키지 않고, 빠르게 복구할 수 있도록 돕는다.
이를 통해 사용자가 불필요하게 대기하는 시간을 줄이고, 시스템의 안정성을 보장할 수 있다.
장애가 다른 시스템으로 전파된다는 것이 잘 이해가 가지 않을 수도 있다.
MSA에서 서비스 간의 상호 의존성으로 인해 장애가 연쇄적으로 확산될 수 있다.
각 서비스는 서로 호출하며 기능을 제공하므로, 하나의 서비스가 장애를 겪을 때 해당 서비스와 연관된 다른 서비스들도 영향을 받을 수 있다.
📌 장애 전파 예시
서비스 A가 서비스 B를 호출하고, 서비스 B에서 장애가 발생해 응답이 없거나 응답이 매우 느려지면, 서비스 A는 정상적인 처리 시간이 지날 때까지 해당 요청을 대기하게 된다.
이 과정에서 서비스 A의 쓰레드가 응답을 기다리며 차단되고, 지속적으로 이러한 요청이 누적되면 서비스 A의 쓰레드가 고갈되어 더 이상 새로운 요청을 처리할 수 없게 된다.
결국 서비스 A도 장애 상태에 빠지게 되고, 이로 인해 서비스 C, D, E와 같이 서비스 A와 연관된 다른 서비스들에도 장애가 전파될 수 있다.
또한, 장애가 발생한 서비스에 계속해서 요청을 보내는 것은 서비스 복구를 더 어렵게 만든다.
장애 상태에서 지속적인 요청이 들어오면 서비스의 자원이 추가적으로 소모되어 복구가 지연될 수 있다. 서킷 브레이커가 없다면, 장애가 발생한 서비스가 응답하지 않거나 타임아웃이 발생할 때까지 모든 요청이 대기 상태에 머무르게 되어 시스템 자원이 낭비되고, 다른 서비스들까지도 장애 상태에 빠지게 되는 결과를 초래한다.
서킷 브레이커는 전기 회로 차단기처럼 동작하며, 세 가지 상태로 구분된다.
서킷 브레이커는 외부 서비스의 상태를 모니터링하며, 임계치를 초과한 실패가 발생하면 더 이상의 요청을 차단하여 장애 확산을 방지한다. 이후 시스템이 복구되면 요청을 다시 정상적으로 처리하게 된다.
서킷 브레이커 패턴은 상태 및 히스토리 관리에 필요한 추가 비용이 발생할 수 있다.
또한 서킷 브레이커가 지나치게 민감하게 설정되면, 장애가 복구된 이후에도 요청이 정상적으로 처리되지 않을 수 있다.
완벽한 시스템은 존재하지 않으며, 서비스 장애는 언제든지 발생할 수 있다.
중요한 것은 장애 발생 시 얼마나 빠르게 대응하고 시스템을 복구할 수 있는지이다.
서킷 브레이커 패턴은 장애 확산을 막고 시스템의 안정성을 유지하는 데 중요한 역할을 한다.
MSA 환경에서는 하나의 서비스 장애가 전체 시스템에 영향을 미칠 수 있기 때문에 서킷 브레이커를 적용함으로써 장애 전파를 차단하고, 복구 후에도 시스템이 정상적으로 작동할 수 있도록 보장한다.
따라서 서킷 브레이커는 서비스 간의 독립성을 유지하고, 장애가 발생하더라도 시스템이 이를 감지하고 회복할 수 있도록 돕는 필수적인 도구이다.