스택큐힙리스트

백프레셔 한 방에 끝! 대기 큐 설계·구현 실습 가이드 본문

개발

백프레셔 한 방에 끝! 대기 큐 설계·구현 실습 가이드

스택큐힙리스트 2025. 7. 10. 07:52
반응형

⚡ 왜 지금 ‘대기 큐 + 백프레셔’인가?

트래픽은 순간 폭발하고, 다운타임은 곧 매출 손실로 이어집니다. 대기 큐(Waiting Queue)는 급류처럼 밀려오는 요청을 임시 보관해 시스템을 보호하고, 백프레셔(Back-Pressure)는 “잠깐! 지금은 못 받아”를 선언해 과부하를 미리 차단합니다. 쿠팡, 토스, 네이버 같은 톱 트래픽 서비스가 공통으로 채택한 이유이죠.


1. 대기 큐 설계 핵심 체크리스트

  1. 큐 타입
    • 브로커 기반: Kafka·RabbitMQ — 높은 내구성, 멀티 컨슈머
    • 인메모리 기반: Redis Streams — 초저지연, 간단한 셋업
  2. 메시지 보존 정책
    • At-Least-Once vs Exactly-Once 요구사항 명확화
  3. 우선순위 & TTL
    • VIP 트래픽 먼저? 지연 허용치가 낮은 메시지엔 TTL 설정
  4. 컨슈머 풀 사이징
    • 처리량(QPS) = 컨슈머 수 × 작업 속도. 모니터링으로 실시간 조절

2. 백프레셔 디자인 패턴 3종

a. 토큰 버킷(Leaky Bucket 변형)

 
rate: 500 req/sec   # 초당 500 토큰
burst: 100          # 최대 버스트

b. Slow-Consumer Detection

  • Kafka의 fetch.max.bytes, max.poll.interval.ms로 느린 컨슈머 격리
  • Redis Streams는 XCLAIM으로 지연 메시지를 다른 워커에게 이관

c. Circuit Breaker

CircuitBreaker cb = CircuitBreaker.ofDefaults("queueWriter");

3. 실습: Spring Boot + Kafka로 “안전한 주문 큐” 만들기

1. Kafka 토픽 생성

kafka-topics --create \
  --topic order-events \
  --replication-factor 3 \
  --partitions 12 \
  --config retention.ms=604800000

2. 프로듀서 백프레셔 적용

props.put(ProducerConfig.LINGER_MS_CONFIG, "10");    // 배치 전송
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, "67108864"); // 64 MB 버퍼
props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, "3000");      // 큐 꽉 차면 3 초 대기

3. 컨슈머 그룹 오토스케일링

hpa:
  minPods: 2
  maxPods: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 60

4. Slow 컨슈머 모니터링

 
kafka-consumer-groups --describe --group order-service

LAG 지표가 급등하면 알림 → 컨슈머 증설 or 장애 조치.


4. 운영 팁 💡

  • Observability: Prometheus + Grafana로 lag, processing time, queue depth 한눈에.
  • Fail-Safe 메시지: DLQ(Dead Letter Queue)로 비정상 메시지 격리, 데이터 손실 0 건 달성.
  • 리플레이 전략: 이벤트 소싱 구조라면 오프셋 초기화로 재처리 플랜 필수.

결론 ✍️

대기 큐로 ‘버퍼’를 만들고 백프레셔로 ‘제동’을 거는 순간, 시스템은 스파이크 트래픽에도 흔들리지 않습니다. 실무에서는 “측정 → 한도 설정 → 자동화” 세 단계를 반복하며 지표를 꾸준히 조정하세요. 시나리오별로 미리 부하 테스트를 돌려 두면, 장애 발생 시 복구 시간(MTTR)도 자연스레 줄어듭니다.

반응형
Comments