2024. 12. 12. 19:53ㆍSpring Microservice
🔌 회로 차단기에서 링 버퍼를 사용하는 이유 🔄
회로 차단기(Circuit Breaker)는 시스템을 보호하기 위해 요청의 실패율을 모니터링하는 중요한 패턴입니다. 이 과정에서 🔄 링 버퍼(Ring Buffer) 를 사용하면 성능과 메모리 효율을 최적화할 수 있습니다.
1️⃣ 링 버퍼란? 🌀
🔄 링 버퍼(Ring Buffer) 는 고정된 크기의 원형 큐(Circular Queue) 로, FIFO(First In First Out) 방식 으로 동작합니다.
✅ 데이터가 추가될 때 버퍼가 가득 차면 가장 오래된 데이터를 자동으로 덮어씀
✅ 메모리를 일정하게 유지 하면서 최근 데이터만 보존
2️⃣ 회로 차단기에서 링 버퍼를 사용하는 이유 ⚡
✔️ 1) 효율적인 실패율 계산 📉
회로 차단기는 최근 요청의 성공/실패 여부를 저장하고, 실패율을 계산하여 상태(Closed, Open, Half-Open)를 변경 합니다.
✅ 링 버퍼를 사용하면 메모리 사용량을 일정하게 유지하면서 최신 실패율을 계산할 수 있음
✅ 가장 오래된 데이터를 자동 삭제 하므로 데이터 관리가 간단하고 효율적임
✔️ 2) 메모리 효율성 🚀
메모리를 절약하면서 일정한 크기의 데이터를 유지할 수 있습니다.
✅ 고정된 크기의 버퍼를 사용하여 불필요한 메모리 할당을 방지
✅ 최근 N개의 데이터만 유지하여 전체 요청 데이터를 저장할 필요 없음
✔️ 3) 빠른 데이터 추가 및 제거 ⚡
링 버퍼는 O(1) 시간 복잡도 로 데이터를 추가/삭제할 수 있습니다.
✅ 요청이 많아도 성능 저하 없이 빠르게 동작
✅ 최근 데이터를 빠르게 확인하고 업데이트하는 것이 가능
✔️ 4) 시간 기반 슬라이딩 윈도우 구현 ⏳
링 버퍼를 사용하면 시간 기반 윈도우(Sliding Window) 방식 으로 요청을 추적할 수 있습니다.
📌 예제
🔹 slidingWindowSize = 10
, failureRateThreshold = 50%
라면?
✅ 최근 10개의 요청 중 5개 이상 실패 시 회로 차단기 OPEN! 🚫
🔹 시간 기반 윈도우(예: 1분)
✅ 1분 동안의 요청을 추적하여 실패율이 높으면 Open 상태로 전환
✔️ 5) 이벤트 손실 방지 🔄
요청의 성공/실패 데이터를 순서대로 처리하면서 데이터 누락을 방지 할 수 있습니다.
✅ 최신 데이터가 항상 반영 되므로 정확한 실패율 계산이 가능
✅ 오래된 데이터는 자동 삭제, 최신 요청 데이터를 유지
3️⃣ 링 버퍼를 활용한 회로 차단기 동작 원리 🔍
🟢 1) 요청 데이터 저장
✅ 링 버퍼는 각 요청의 성공/실패 여부(Boolean 값) 를 저장함
✅ 요청이 추가되면 가장 오래된 데이터를 덮어씀
🟡 2) 실패율 계산 📊
✅ 링 버퍼에 저장된 데이터를 기반으로 실패율을 계산
✅ 임계치를 초과하면 회로 차단기가 OPEN 상태로 전환! 🚫
🔴 3) 시간 기반 윈도우 처리 ⏳
✅ 일정 시간 동안(예: 1분) 데이터를 유지하며 최근 요청만 분석
✅ 링 버퍼 덕분에 오래된 데이터는 자동으로 제거됨
4️⃣ 예제: Resilience4j에서 링 버퍼 사용 🛠
📌 주요 설정
Resilience4j에서 slidingWindowType과 slidingWindowSize 를 설정하여 링 버퍼 동작을 조절할 수 있습니다.
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowType: COUNT_BASED # 요청 횟수 기반 윈도우
slidingWindowSize: 10 # 최근 10개의 요청을 유지
failureRateThreshold: 50 # 실패율 임계치 (%)
✅ COUNT_BASED : 최근 N개의 요청을 저장해 실패율을 계산
✅ TIME_BASED : 특정 시간(예: 1분) 동안의 요청을 저장해 실패율을 계산
📌 동작 예제
🌀 링 버퍼 크기가 10
✅ 최근 10개의 요청 중 5개 실패 → 실패율 50% → OPEN 상태
🚫
🕒 시간 기반 윈도우 (예: 1분)
✅ 1분 동안의 요청 중 실패율 계산 → 임계치 초과 시 OPEN!
5️⃣ 링 버퍼의 대안: 배열과 리스트 비교 🆚
데이터 구조 | 특징 | 단점 |
---|---|---|
배열 📦 | 고정 크기 | 오래된 데이터를 직접 삭제해야 함 ❌ |
리스트 📜 | 동적 크기 | 크기가 커질수록 메모리 사용량 증가 ❌ |
링 버퍼 🔄 | 고정 크기 + 자동 덮어쓰기 | ✅ 메모리 절약 ✅ 빠른 연산 |
🚀 링 버퍼의 장점
✅ 고정된 크기 유지 → 메모리 사용량 일정
✅ O(1) 연산 속도 → 빠른 데이터 추가/삭제 가능
✅ 자동 덮어쓰기 → 데이터 관리가 쉬움
6️⃣ 결론 🎯
회로 차단기에서 링 버퍼를 사용하는 이유는 다음과 같습니다.
✅ 효율적인 메모리 사용: 고정 크기를 유지하여 메모리 절약 가능
✅ 빠른 데이터 관리: O(1) 연산 속도로 높은 성능 유지
✅ 실패율 계산 최적화: 최신 데이터만 유지하여 정확한 판단 가능
✅ 시간 기반 & 횟수 기반 슬라이딩 윈도우 구현 가능
🔌 이를 통해 회로 차단기는 장애를 신속하게 감지하고 시스템을 보호할 수 있습니다! 🚀
'Spring Microservice' 카테고리의 다른 글
spring cloud gateway의 route predicate factories (0) | 2024.12.15 |
---|---|
@CircuitBreaker의 name 속성 (0) | 2024.12.12 |
bulkhead 패턴 (0) | 2024.12.12 |
fallback 패턴 활용 예 (0) | 2024.12.12 |
fallback 패턴 (0) | 2024.12.12 |