
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 |