PHpullh
학습 라이브러리/Kotlin/서킷 브레이커 (Circuit Breaker)

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) 학습 시 주의할 점은 무엇인가요?

서킷 브레이커의 임계값을 너무 낮게 설정하면 일시적 오류에도 서킷이 열립니다. 서비스 특성에 맞게 조절하세요.