ring buffer bit

2024. 12. 12. 19:53Spring 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