Resilience Patterns

 

Resilience Patterns

  • 장애가 발생할 것이라고 가정 -> 장애 수용
    • 특히 분산 시스템에서 예상치 못한 장애 처리 필요
    • 네트워크 또는 컨테이너 장애 시 마이크로서비스는 요청을 다시 시도하기 위한 전략 필요
  • 최악의 시나리오에 대비할 수 있는 장애를 허용(극복) 하는 마이크로서비스 설계
    • 단일 마이크로서비스가 실패하거나 잠시 응답하지 못할 수 있음
    • 서비스 과부하, 늦은 응답, 네트워크 문제 등
  • 마이크로서비스의 회복성(Resilience) 설계
    • 장애에 대한 복원성(회복성)
    • 부분적 장애 허용
    • 장애가 발생할 것이라고 가정하고 복원성(회복성)을 위한 마이크로서비스를 설계
  • 장애 허용(Fault Tolerance)
    • 다운타임이나 데이터 손실 없이 대응
    • 장애 후 App을 완전히 작동하는 상태로 되돌림
    • 장애를 우아하게 처리 (Graceful shutdown)
  • 회복성(Resilience)
    • 마이크로서비스 시스템은 장애 또는 중단하더라도 효과적으로 계속 작동 가능
  • 내결합성(Fault tolerance)
    • 일부 구성 요소 내에서 하나 이상의 오류가 발생하는 경우에는 시스템은 정상적으로 작동
  • 서비스 간 통신은 분산되고 많은 내부 또는 외부 네트워크 트래픽이 트랜잭션을 위해 생성
    • 모놀리식에 비해 내구성 보장이 어려움
    • 서비스 간 통신 필요성과 외부 서비스에 대한 종속성 증가
    • 오류가 발생할 가능성이 증가
  • Resilience Pattern (회복성 패턴)
    • 중단 없는 마이크로서비스를 제공
  • 회복성 패턴 종류
    • Retry Pattern
    • Circuit Breaker Pattern
    • Bulkhead Pattern
    • Timeout Pattern
    • Fallback Pattern

 

Resilience:  Retry  Pattern

  • HTTP, gRPC 등을 사용하는 서비스 간 통신
    • 네트워크, 서버 및 물리적 오류가 발생할 수 있음
    • Tx의 서비스 중 하나가 500 Error Code 반환 -> Tx이 중단, 오류 반환
    • 사용자가 동일한 Tx 다시 시작 -> 정상 작동
  • 마이크로서비스는 일시적인 오류로 인해 실패 가능
    • 이러한 오류는 짧은 시간 내에 발생, 이후에 수정 됨
  • Retry Pattern
    • 실패할 경우 작업을 자동으로 재시도
    • 마이크로서비스가 자체 수정 -> 스스로를 수정할 시간 허용
    • 서비스에 지속적인 장애 발생, 장시간 사용할 수 없는 경우 -> 실패한 요청이 지나치게 많아지게 됨
    • Circuit Breaker, Fallback 추가 구현 필요

 

Resilience:  Circuit  Breaker  Pattern

 

  • 전자시스템 회로를 보호하기 위해 시스템에 장애가 발생할 경우 더 이상의 부하 전달 중지하는 기능
  • Circuit Breaker Pattern
    • 외부 의존성(종속성)에 대한 장애로부터 보호
    • 한 서비스의 장애가 다른 서비스에 연쇄 효과를 미치지 않도록 차단
  • 서비스 간 통신 모니터링 -> 오류 추적
    • 시스템의 오류가 특정 임계값(Threshold)을 초과 -> Circuit Breaker가 작동되고(Open) 통신 차단 -> 미리 결정된 오류 메시지 반환
    • Circuit Breaker가 열려 있는 동안 통신 트래픽을 계속 모니터링
    • 요청된 서비스가 성공적인 결과를 반환하면 Circuit Breaker 종료(Close)

  • Close(닫힘)
    • Circuit Breaker가 닫힘
    • 모든 요청이 실행
  • Open(열림)
    • Circuit Breaker가 열림
    • 오류가 발생하는 동안 애플리케이션이 작업을 반복적으로 실행하려고 하지 않도록 처리
  • Half Open(반열림)
    • Circuit Breaker는 오류가 계속 발생하는지 확인하기 위해 몇 가지 작업을 실행
    • 오류가 발생하면 Circuit Breaker가 열림
    • 오류가 발생하지 않으면 Circuit Breaker는 닫힘

 

Resilience:  Bulkhead  Pattern

  • Bulkhead Pattern
    • 분산 시스템에서 장애를 격리하는 데 사용
  • 마이크로서비스에서 개별 서비스 인스턴스 또는 서비스 인스턴스 그룹을 서로 격리
    • 시스템의 한 부분에서 장애가 발생해도 전체 시스템에 영향을 미치지 않도록 함
    • 한 위치에서 서비스를 격기하여 다른 서비스에 영향을 미치지 않도록 함
    • 오류 장소를 격리하고 나머지 서비스를 보호
  • Use-case
    • 서비스에 부하가 많고 다른 서비스 인스턴스와 리소스 경합 위험이 있는 경우
    • 서비스가 연쇄 장애 위험이 있는 경우
    • 다운스트림 서비스를 사용할 수 없게 되거나 성능 문제가 발생하는 경우

 

Resilience:  Timeout  Pattern

  • 서비스 응답을 무한정 기다리지 않고 예외 발생
    • 서비스 호출이 완료되는 데 예상보다 오래 걸리는 경우 사용
    • 최대 시간 제한 설정
    • Timeout 오류 발생
  • 마이크로서비스에서 서비스 호출이 완료되는 데 너무 오래 걸리는 것을 방지
  • 특정 서비스가 요청을 완료하는 데 예상보다 오래 걸리는 경우 -> 요청을 취소하고 오류

 

Resilience:  Fallback  Pattern

  • 요청이 실패하거나 시간 초과될 경우 대체 동작이나 응답 제공
    • 서비스를 사용할 수 없는 경우
    • 클라이언트는 캐시 된 버전의 데이터 사용
    • 사용자에게 기본 메시지 표시 -> 대체 처리
  • 서비스 호출이 실패하거나 시간 초과될 경우 호출되는 Fallback 함수 정의
    • Fallback 함수에서 대체 응답 제공
    • 특정 서비스를 사용할 수 없거나 요청을 완료하는데 너무 오래 걸리는 경우
    • 오류 메시지 표시 or 나중에 다시 시도할 수 있는 옵션 제공

 

Reference
마이크로서비스 디자인 패턴 완벽 가이드
https://www.inflearn.com/course/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-msa

'기타 정보 > MSA' 카테고리의 다른 글

Deployment Patterns  (0) 2025.08.27
Scalability  (0) 2025.08.27
Authentication & Authorization  (0) 2025.08.27
Observability: Distributed Logging/Tracing  (0) 2025.08.27
EDA (Event-Driven Architecture)  (1) 2025.08.27
Distributed Transaction(Saga Pattern, Outbox, CDC)  (0) 2025.08.27
CQRS - Command Query Responsibility Segregation  (2) 2025.08.26
Database Sharding Pattern  (2) 2025.08.26