KOTLIN · 예외처리
서킷 브레이커 (Circuit Breaker)
연속 실패 시 호출을 차단하여 시스템을 보호합니다. CLOSED → OPEN → HALF_OPEN 상태 전이를 관리합니다.
예외처리고급circuit-breakerresiliencestate-machinefault-tolerance
핵심 설명
연속 실패 시 호출을 차단하여 시스템을 보호합니다. CLOSED → OPEN → HALF_OPEN 상태 전이를 관리합니다.
Kotlin code
import kotlinx.coroutines.*
class CircuitBreaker(
private val failureThreshold: Int = 3,
private val resetTimeout: Long = 5000
) {
enum class State { CLOSED, OPEN, HALF_OPEN }
private var state = State.CLOSED
private var failureCount = 0
private var lastFailureTime = 0L
suspend fun <T> execute(block: suspend () -> T): T {
return when (state) {
State.OPEN -> {
if (System.currentTimeMillis() - lastFailureTime > resetTimeout) {
state = State.HALF_OPEN
tryExecute(block)
} else {
throw RuntimeException("서킷 OPEN - 요청 차단")
}
}
State.HALF_OPEN -> tryExecute(block)
State.CLOSED -> tryExecute(block)
}
}
private suspend fun <T> tryExecute(block: suspend () -> T): T = try {
val result = block()
reset()
result
} catch (e: Exception) {
recordFailure()
throw e
}
private fun reset() { state = State.CLOSED; failureCount = 0 }
private fun recordFailure() {
failureCount++
lastFailureTime = System.currentTimeMillis()
if (failureCount >= failureThreshold) {
state = State.OPEN
println("서킷 OPEN! ($failureCount회 실패)")
}
}
}
fun main() = runBlocking {
val cb = CircuitBreaker(failureThreshold = 2)
repeat(5) { i ->
runCatching {
cb.execute { throw RuntimeException("API 오류 $i") }
}.onFailure { println("호출 $i: ${it.message}") }
}
}학습 팁
HALF_OPEN 상태에서 성공하면 CLOSED로 복구하여 정상 트래픽을 허용합니다. 자동 복구 메커니즘입니다.
주의할 점
서킷 브레이커의 임계값을 너무 낮게 설정하면 일시적 오류에도 서킷이 열립니다. 서비스 특성에 맞게 조절하세요.
자주 묻는 질문
서킷 브레이커 (Circuit Breaker)란 무엇인가요?
연속 실패 시 호출을 차단하여 시스템을 보호합니다. CLOSED → OPEN → HALF_OPEN 상태 전이를 관리합니다.
서킷 브레이커 (Circuit Breaker) 학습 시 주의할 점은 무엇인가요?
서킷 브레이커의 임계값을 너무 낮게 설정하면 일시적 오류에도 서킷이 열립니다. 서비스 특성에 맞게 조절하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.