Microservice client resiliency

2025. 2. 28. 14:35Spring Microservice/Microservices Patterns

📌 마이크로서비스 클라이언트 회복 탄력성 패턴(Microservice Client Resiliency Patterns)

마이크로서비스 아키텍처는 분산된 환경에서 운영되므로, 특정 서비스가 장애를 일으켰을 때 전체 시스템에 영향을 주지 않도록 설계해야 합니다.
이를 위해 클라이언트 측에서 장애를 감지하고 대응하는 회복 탄력성(Resiliency) 패턴을 적용할 수 있습니다.

📌 아래 그림에서는 다음 4가지 클라이언트 회복 탄력성 패턴을 소개합니다.

출처 : Spring Microservices in Action 2nd Edition

🔹 1. 클라이언트 측 부하 분산(Client-Side Load Balancing)

  • 마이크로서비스는 다수의 인스턴스를 실행하여 확장성과 가용성을 높일 수 있음.
  • 클라이언트는 서비스 디스커버리에서 가져온 엔드포인트 정보를 캐싱하고, 요청을 여러 인스턴스에 균등하게 분산.
  • Spring Cloud LoadBalancer(기존 Ribbon) 또는 gRPC Load Balancer 같은 기술을 사용하여 구현 가능.

장점
부하를 여러 서비스 인스턴스로 분산하여 성능 향상
장애 발생 시 정상적인 인스턴스로 트래픽 자동 분배 가능

🔹 2. 회로 차단기 패턴(Circuit Breaker Pattern)

  • 특정 서비스가 장애를 일으키거나 응답 속도가 느려지면, 클라이언트가 계속해서 해당 서비스로 요청을 보내면 안 됨.
  • Circuit Breaker는 장애가 감지되면 일정 시간 동안 해당 서비스로의 호출을 차단하여 빠르게 실패 처리(fail fast)하도록 함.
  • Spring Boot에서는 Resilience4j를 사용하여 구현 가능.

장점
느린 서비스로 인해 클라이언트가 리소스를 과도하게 소비하는 문제 방지
서비스 복구 후 자동으로 다시 요청 가능(open → half-open → closed)

🔹 3. 폴백 패턴(Fallback Pattern)

  • 특정 서비스가 실패했을 때, 클라이언트가 대체 가능한 방법을 선택할 수 있도록 함.
  • 예를 들어, 캐시된 데이터 반환, 기본값 제공, 다른 서비스 호출 등의 대체 로직을 수행.
  • Hystrix(Deprecated) 또는 Resilience4j Fallback 기능을 활용하여 구현 가능.

장점
서비스 장애 시에도 사용자 경험 유지 가능
데이터가 없더라도 최소한의 기능을 제공하여 다운타임 방지

🔹 4. 벌크헤드 패턴(Bulkhead Pattern)

  • 잘못된 서비스 호출이 전체 애플리케이션에 영향을 주지 않도록 분리(격리)하는 패턴.
  • 예를 들어, 서비스 A와 서비스 B의 호출을 별도의 스레드 풀에서 처리하여 특정 서비스의 장애가 다른 서비스에 영향을 주지 않도록 함.
  • Resilience4j의 Bulkhead 기능을 활용하여 구현 가능.

장점
하나의 서비스 장애가 전체 애플리케이션을 다운시키는 문제 방지
다양한 서비스 요청을 격리하여 개별적인 성능 유지 가능

📌 Summary

패턴 설명 대표적인 구현 방식
클라이언트 측 부하 분산(Client-Side Load Balancing) 여러 서비스 인스턴스로 트래픽을 분산 Spring Cloud LoadBalancer, gRPC Load Balancer
회로 차단기(Circuit Breaker) 장애가 발생한 서비스로 계속 요청하지 않도록 차단 Resilience4j Circuit Breaker
폴백(Fallback) 서비스 장애 시 대체 데이터 또는 다른 처리 방식을 제공 Resilience4j Fallback, 캐싱 활용
벌크헤드(Bulkhead) 잘못된 서비스가 전체 시스템을 방해하지 않도록 요청을 격리 Resilience4j Bulkhead

📌 결론

마이크로서비스 환경에서는 서비스 장애가 다른 서비스나 전체 시스템에 영향을 주지 않도록 설계해야 합니다.
클라이언트 측 부하 분산을 사용하여 트래픽을 분산하고,
회로 차단기 패턴을 적용하여 장애 감지 후 빠르게 실패하도록 처리하며,
폴백 패턴을 사용하여 대체 데이터를 제공하고,
벌크헤드 패턴을 활용하여 서비스 요청을 분리하면,
💡 보다 안정적이고 회복력이 강한(Resilient) 마이크로서비스 아키텍처를 구축할 수 있습니다. 🚀