대규모에서 장애는 불가피합니다 — 서버가 죽고, 네트워크가 실패하며, 의존성이 사용 불가능해집니다. 장애를 위한 설계는 모든 것이 동작한다고 가정하기보다 장애를 우아하게 견디고 복구하는 시스템을 구축하는 것을 의미합니다. 이는 신뢰성 있는 시스템에 필수적입니다.
장애를 위한 설계 (마인드셋)
무언가는 실패할 것이라 가정 → 대규모에서 장애는 예외가 아니라 정상:
→ 서버가 죽고, 네트워크가 분할되며, 디스크가 실패하고, 의존성이 다운되고, 트래픽이 급증
→ 장애를 예상하고 우아하게 처리하도록 설계 (모든 것이 동작한다고 가정하지 않음)
→ "모든 것은 항상 실패한다" → 복원력을 내장.
복원력 기법
✓ 중복성 → 여러 인스턴스, 단일 장애점 없음 (정상 인스턴스로 failover)
✓ 재시도 (백오프와 함께) → 일시적 장애 재시도 (지수 백오프 + jitter로
복구 중인 서비스를 압도하지 않음)
✓ 타임아웃 → 실패하는 의존성을 영원히 기다리지 않음 (빠르게 실패)
✓ CIRCUIT BREAKER → 실패하는 서비스 호출을 일시 중단 (연쇄 장애 방지;
복구 시간 제공) → 빠르게 실패하고 폴백
✓ GRACEFUL DEGRADATION → 완전 실패 대신 축소된 기능 (예: 서비스 다운 시
캐시된/부분 데이터 표시)
✓ 폴백 → 무언가 실패할 때 기본/대체값
✓ BULKHEAD / 격리 → 장애 봉쇄 (한 부분 실패가 전체를 침몰시키지 않음)
