이전 챕터에서 마이크로서비스에서의 복원력에 대해 간략히 소개했어요. 이번 챕터에서는 마이크로서비스에서 흔히 겪을 수 있는 시나리오를 통해 장애 허용(fault tolerance)이 왜 중요한지, 그리고 우리의 마이크로서비스가 일상적으로 직면할 수 있는 문제들에 대해 어떻게 복원력을 가져야 하는지에 대해 설명드릴게요.
여기 API 게이트웨이 또는 엣지 서버가 있다고 가정해볼게요. 이 서버는 외부 클라이언트로부터 들어오는 트래픽을 처리해요. 우리의 마이크로서비스 네트워크에는 Accounts 마이크로서비스에 fetchCustomerDetails
라는 REST API가 있어요. 이 API를 호출하면, 고객의 전체 정보, 즉 계좌 정보, 대출 정보, 카드 정보를 받아야 해요.
이 과정은 다음과 같아요:
이제 이 과정 중에 하나의 마이크로서비스, 예를 들어 Cards 마이크로서비스가 문제를 겪고 있다고 가정해볼게요. 이 마이크로서비스가 너무 많은 요청을 처리하느라 지연되거나, 아예 응답을 하지 못할 수도 있어요.
보통, Accounts 마이크로서비스는 Cards 마이크로서비스로부터 1초 이내에 응답을 기대해요. 하지만 문제가 발생하면, Cards 마이크로서비스가 10초 이상 걸리거나 아예 응답하지 않을 수도 있어요.
Accounts 마이크로서비스가 Cards 마이크로서비스의 응답을 제때 받지 못하면, 다음과 같은 일이 발생해요:
이것이 바로 하나의 마이크로서비스의 문제가 어떻게 전체 마이크로서비스 네트워크에 연쇄적인 영향을 미칠 수 있는지 보여주는 전형적인 시나리오에요.
이런 상황을 방지하기 위해 서킷 브레이커 패턴과 같은 복원력 패턴을 사용할 수 있어요. 이 패턴은 문제가 있는 서비스를 전체 시스템에 영향을 주지 않도록 격리시키는 데 도움을 줘요.
서킷 브레이커 패턴은 마이크로서비스 네트워크에서 발생할 수 있는 연쇄적인 실패(cascading failure)를 방지하기 위한 패턴입니다. 이 패턴은 전기 시스템에서 사용하는 서킷 브레이커(회로 차단기)의 원리에서 영감을 받아 소프트웨어 개발에 적용된 것입니다.
전기 회로 차단기는 과도한 전류나 잠재적인 화재 위험으로부터 전기 회로를 보호하기 위해 설계된 안전 장치입니다. 회로 차단기는 단락(short circuit)이나 전기 과부하가 발생했을 때 이를 감지하고 자동으로 회로를 차단하여, 전기 기기들이 손상되지 않도록 보호합니다. 만약 회로 차단기가 없다면, 과부하된 전류가 전기 기기로 흘러들어가 결국 기기가 손상될 수 있습니다.
전기 시스템에서 전류가 네트워크를 통해 흐르는 것처럼, 분산 환경에서 원격 리소스나 서비스에 대한 호출이 발생합니다. 이 원격 호출은 여러 가지 이유로 실패할 수 있습니다. 예를 들어, 일시적인 오류(transient faults), 느린 네트워크, 타임아웃, 리소스 과부하, 일시적인 서비스 비가용 등이 있습니다. 대부분의 경우 이러한 오류는 짧은 시간 후에 자동으로 해결되지만, 이러한 잠재적인 문제에 대해 마이크로서비스가 복원력을 갖추도록 준비해야 합니다.
서킷 브레이커 패턴은 전기 회로 차단기와 마찬가지로 특정 서비스로의 원격 호출을 모니터링합니다. 만약 서비스가 너무 오래 응답하지 않거나, 응답 속도가 느려지거나, 네트워크 문제가 발생하면, 서킷 브레이커는 해당 호출을 중단시킵니다. 그리고 다수의 호출이 실패하거나 문제가 발생하는 경우, 서킷 브레이커는 해당 서비스로의 모든 추가적인 요청을 즉시 실패로 처리합니다. 이를 통해 다른 서비스들이 오랜 시간 동안 응답을 기다리며 리소스를 낭비하는 상황을 방지할 수 있습니다.
이 과정에서 서킷 브레이커는 서비스가 복구될 시간을 주며, 일정 시간 후에 일부 트래픽을 서비스로 보내서 서비스가 정상적으로 복구되었는지 확인합니다. 만약 이 테스트 트래픽이 성공하면, 서킷 브레이커는 다시 모든 요청을 허용하지만, 여전히 문제가 있다면 일정 시간 동안 다시 요청을 차단합니다.
빠른 실패 처리: 서비스가 응답하지 않거나 문제가 있을 때, 요청을 빠르게 실패 처리하여 다른 서비스가 오랜 시간 대기하지 않도록 합니다.
우아한 실패 처리: 서킷 브레이커를 사용하면 요청이 실패할 때 우아하게 실패 처리(fallback)를 구현할 수 있습니다. 예를 들어, 기본 값을 반환하거나 캐시된 데이터를 사용할 수 있습니다.
서비스의 원활한 복구 지원: 서킷 브레이커는 문제가 있는 서비스에 일정 시간 동안 휴식 시간을 주어 서비스를 원활하게 복구할 수 있도록 돕습니다.
물론입니다! 이제 강의를 요약해드릴게요.
서킷 브레이커 패턴은 특정 마이크로서비스에 대한 트래픽을 제어하기 위해 설계된 패턴입니다. 기본적으로 서킷 브레이커는 모든 마이크로서비스를 모니터링하지 않으며, 필요한 마이크로서비스에만 이 패턴을 구성해야 합니다. 서킷 브레이커 패턴이 활성화되면, 트래픽의 흐름을 제어하기 위해 세 가지 상태를 사용합니다.
서킷 브레이커 패턴의 구현은 복잡하게 들릴 수 있지만, Resiliency4j와 Spring Boot Framework와 같은 라이브러리와 프레임워크를 사용하면 쉽게 구성할 수 있습니다.
다음 강의에서 서킷 브레이커 패턴을 실제로 구현할 예정이니, 이 세 가지 상태(Closed, Open, Half Open)에 대해 명확히 이해하고 넘어가는 것이 중요합니다.