Phase 5레슨 21
Fault Tolerance
Failover, Graceful Degradation, Bulkhead, Backpressure — 장애를 견디는 설계
💡ELI5·
배의 수밀 격벽과 Fault Tolerance
일반 시스템: 서비스 A, B, C가 자원을 공유 → A가 자원을 다 쓰면 B, C도 장애 Fault Tolerant 시스템 (Bulkhead): ┌─────┐ ┌─────┐ ┌─────┐ │ A │ │ B │ │ C │ ← 격리된 자원 │풀 10│ │풀 10│ │풀 10│ └─────┘ └─────┘ └─────┘ → A가 장애 나도 B, C는 정상
💡 비유 — 배의 수밀 격벽(Bulkhead). 한 구획에 물이 차도 다른 구획은 안전. 배 전체가 가라앉지 않는다. 소프트웨어도 서비스별로 자원을 격리하면 한 서비스 장애가 전체 장애로 번지지 않는다.
🔬Deep Dive·
장애 견디기 패턴
| 패턴 | 동작 | 해결하는 문제 |
|---|---|---|
| Failover | 장애 노드 감지 → 예비 노드로 전환 | 단일 노드 장애 |
| Graceful Degradation | 부가 기능 축소, 핵심만 유지 | 부분 장애 시 전체 중단 방지 |
| Bulkhead | 자원을 격리된 풀로 분할 | 한 서비스가 자원 독점 방지 |
| Backpressure | Consumer가 Producer에게 속도 조절 신호 | Consumer 압도 방지 |
| Circuit Breaker | 장애 서비스 호출 차단 | 장애 전파 방지 (Phase 2 참조) |
| Rate Limiting | 요청 수 제한 | 과부하 방지 |
🔬Deep Dive·
Bulkhead 구현 예시
// 각 서비스마다 독립된 커넥션 풀
const orderPool = createPool({ max: 10 }); // 주문 전용
const paymentPool = createPool({ max: 10 }); // 결제 전용
const shippingPool = createPool({ max: 10 }); // 배송 전용
// 결제 서비스가 장애 나서 paymentPool이 고갈되어도
// orderPool, shippingPool은 영향받지 않음
// 잘못된 예: 풀을 공유하면 한 서비스 장애가 전체로 전파
const sharedPool = createPool({ max: 30 }); // ← 위험!⚖️Trade-off·
Fault Tolerance의 비용
| 이점 | 대가 |
|---|---|
| 부분 장애가 전체 장애로 번지지 않음 | 자원 분할로 효율 감소 (여유 풀 필요) |
| 핵심 기능 지속 보장 | 구현 복잡성 증가 |
| 장애 격리로 디버깅 용이 | 더 많은 인프라 (이중화, 복제) |
| 사용자 경험 보호 | Graceful Degradation 로직 설계 비용 |
❓ 체크포인트 질문
- 1.Fault Tolerance와 High Availability의 차이는?
- 2.Bulkhead 패턴이 무엇이고 어떤 장애를 막는가?
- 3.Graceful Degradation의 예시는?
- 4.Backpressure가 왜 필요한가?
- 5.Failover에서 Active-Active와 Active-Standby의 차이는?