CircuitBreaker Using Redis
· 약 5분
현대 분산 시스템에서 외부 API 호출이나 타 시스템 연동이 빈번해지면서, 장애 전파를 방지하기 위한 Circuit Breaker 패턴의 중요성이 점점 커지고 있다. 특히 여러 인스턴스가 동시에 운영되는 환경에서는 분산 상태 공유가 가능한 구조가 필수다. 본 포스팅에서는 Redis 기반 분산 Circuit Breaker 구현을 중심으로, Kotlin + Coroutine 환경에서 안전하게 사용하는 방식을 소개한다.
📌 Circuit Breaker란?
Circuit Breaker는 시스템에서 반복적인 실패가 발생할 경우, 일정 시간 동안 요청을 차단하여 추가적인 리소스 낭비 및 장애 확산을 막기 위한 보호 패턴이다.
상태 전이
- CLOSED: 정상 상태, 모든 요청 허용
- OPEN: 차단 상태, 모든 요청 거절 (TTL 후 상태 만료)
- HALF_OPEN: 일부 요청 허용 → 복구 테스트 중
CLOSED ──(연속 실패)──▶ OPEN ──(TTL 만료)──▶ HALF_OPEN ──(성공)──▶ CLOSED
└────(실패)────┘
✅ Redis 기반 구현
Redis 구조
| Redis 키 | 설명 |
|---|---|
cb:state (RMapCache) | key별 상태 (CLOSED, OPEN, HALF_OPEN) 저장 |
cb:{key}:failures | 실패 횟수 저장용 (RAtomicLong) |
cb:{key}:success | HALF_OPEN 성공 횟수 저장용 (RAtomicLong) |
기본 알고리즘
- 실패 횟수가 임계치를 넘으면
OPEN상태로 전이, TTL 설정 - TTL 만료 후 상태 키가 사라지면
HALF_OPEN으로 간주 HALF_OPEN상태에서 일부 요청 허용 후 성공 누적 →CLOSED복귀HALF_OPEN에서 다시 실패 시 → 즉시OPEN
