2 min read

Queue Backpressure 제어 패턴

생산자-소비자 속도 불균형에서 시스템 보호를 위한 제한, 버퍼, 재시도 설계

Queue Backpressure 제어 패턴 thumbnail

도입

큐 기반 비동기 처리에서 진짜 문제는 처리량이 아니라 압력 제어(backpressure)다. 소비자가 느려지거나 다운되면 큐 적체가 빠르게 누적되고, 결국 전체 시스템 지연과 타임아웃으로 확산된다. 이 글은 백프레셔를 설계 레벨에서 다루는 패턴을 실무 중심으로 정리한다.

Queue Backpressure 제어 패턴 커버
Wikimedia Commons 기반 무료 이미지

문제 정의

백프레셔를 고려하지 않은 파이프라인은 피크 트래픽에서 예측 불가능하게 무너진다.

  • 생산자 전송 속도 제한이 없어 큐 길이가 무한히 증가한다.
  • 소비자 재시도 정책이 공격적이라 동일 메시지가 폭발적으로 늘어난다.
  • 우선순위 정책이 없어 중요한 작업이 장시간 대기한다.

핵심은 입력을 통제하고 실패를 격리하는 것이다. rate limit, retry budget, dead letter 분리를 동시에 설계해야 한다.

핵심 개념

관점설계 기준검증 포인트
입력 제어producer rate limit큐 적체 증가율
소비 제어consumer concurrency 제한작업 성공률
재시도지수 백오프 + budget중복 처리 비율
격리DLQ + 우선순위 큐핵심 작업 지연 시간

백프레셔는 인프라 옵션이 아니라 애플리케이션 정책이다. 처리 실패 시 어떤 작업을 포기하고 무엇을 보존할지 미리 정해야 한다.

코드 예시 1: Retry budget 제어

export function nextRetryDelay(attempt: number, maxAttempts: number) {
  if (attempt >= maxAttempts) return null;

  const base = 500;
  const delay = Math.min(base * 2 ** attempt, 30_000);
  const jitter = Math.floor(Math.random() * 300);
  return delay + jitter;
}

export function shouldMoveToDlq(attempt: number, maxAttempts: number) {
  return attempt >= maxAttempts;
}

코드 예시 2: 큐 소비자 동시성 제한

const MAX_IN_FLIGHT = 20;
let inFlight = 0;

export async function consume(message: QueueMessage) {
  if (inFlight >= MAX_IN_FLIGHT) {
    await message.nack({ requeue: true, delayMs: 300 });
    return;
  }

  inFlight += 1;
  try {
    await processMessage(message);
    await message.ack();
  } finally {
    inFlight -= 1;
  }
}

아키텍처 흐름

Mermaid diagram rendering...

Clean Architecture 레이어 구조

백프레셔 정책은 애플리케이션 레이어 유즈케이스로 관리하고, 메시지 브로커 구현은 인프라 레이어로 분리하면 테스트와 운영 튜닝이 쉬워진다.

Layer책임적용 방식
Entities작업 상태 모델Job, RetryPolicy
Use Cases처리/재시도 정책ProcessQueueJob
Interface AdaptersQueue Consumer/ProducerKafkaAdapter
FrameworksBroker, MetricsKafka, Prometheus

인프라 구성도

Mermaid diagram rendering...

트레이드오프

  • 강한 입력 제한은 시스템 안정성을 높이지만 순간 처리량을 희생한다.
  • 재시도 예산을 두면 폭주는 막지만 일부 작업은 조기 포기될 수 있다.
  • 우선순위 큐는 중요 작업을 보호하지만 운영 복잡도가 증가한다.

정리

백프레셔 제어의 목적은 모든 작업을 즉시 처리하는 것이 아니라 시스템 붕괴를 막는 것이다. 입력 제한, 재시도 예산, 격리 전략을 함께 설계하면 피크 구간에서도 안정성을 유지할 수 있다.

이미지 출처

  • Cover: source link
  • License: CC BY-SA 2.0 / Author: Derek Harper
  • Note: Wikimedia Commons 무료 라이선스 이미지를 다운로드 후 1600px 기준 JPG로 최적화했습니다.

댓글