2 min read
Queue Backpressure 제어 패턴
생산자-소비자 속도 불균형에서 시스템 보호를 위한 제한, 버퍼, 재시도 설계

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

문제 정의
백프레셔를 고려하지 않은 파이프라인은 피크 트래픽에서 예측 불가능하게 무너진다.
- 생산자 전송 속도 제한이 없어 큐 길이가 무한히 증가한다.
- 소비자 재시도 정책이 공격적이라 동일 메시지가 폭발적으로 늘어난다.
- 우선순위 정책이 없어 중요한 작업이 장시간 대기한다.
핵심은 입력을 통제하고 실패를 격리하는 것이다. 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 Adapters | Queue Consumer/Producer | KafkaAdapter |
| Frameworks | Broker, Metrics | Kafka, Prometheus |
인프라 구성도
Mermaid diagram rendering...
트레이드오프
- 강한 입력 제한은 시스템 안정성을 높이지만 순간 처리량을 희생한다.
- 재시도 예산을 두면 폭주는 막지만 일부 작업은 조기 포기될 수 있다.
- 우선순위 큐는 중요 작업을 보호하지만 운영 복잡도가 증가한다.
정리
백프레셔 제어의 목적은 모든 작업을 즉시 처리하는 것이 아니라 시스템 붕괴를 막는 것이다. 입력 제한, 재시도 예산, 격리 전략을 함께 설계하면 피크 구간에서도 안정성을 유지할 수 있다.
이미지 출처
- Cover: source link
- License: CC BY-SA 2.0 / Author: Derek Harper
- Note: Wikimedia Commons 무료 라이선스 이미지를 다운로드 후 1600px 기준 JPG로 최적화했습니다.