개념/배경

백프레셔 Backpressure는 소비자가 생산자의 처리 속도를 따라가지 못할 때, 소비자가 생산자의 속도를 조절하도록 피드백을 주는 흐름 제어 메커니즘을 의미함 직관적 비유로 좁은 깔때기 소비자에 높은 수압 생산자를 연결했을 때, 깔때기 내부에 물이 차며 더 유입되지 않도록 압력이 올라가거나 수도를 잠그라는 신호를 보내는 상황과 동일함

왜 중요한가

처리 속도 불균형이 누적되면 메모리 초과와 지연 폭증으로 이어짐

  • 생산자 1000 req/s, 소비자 100 req/s 가정
  • 매초 900개가 버퍼에 쌓여 메모리 증가, 결국 OOM 위험
  • 큐 대기열이 길어져 tail-latency 증가, 사실상 영구 대기 상태 발생 가능 백프레셔는 이런 누적을 초기에 억제해 시스템 안정성 확보와 자원 보호에 기여함

핵심 개념과 정의

  • Producer: 데이터를 생성·전송하는 주체
  • Consumer: 데이터를 수신·처리하는 주체
  • Backpressure: 소비자가 처리 가능한 속도로 생산자에 역방향 피드백을 전달해 유량을 제어하는 행위
  • 전략 축: 조절 Control, 버퍼링 Buffering, 드롭 Dropping

동작 원리/전략

A. 조절 Control/Throttling

  • 소비자가 당분간 수신 중단 또는 속도 저하 요구
  • Node.js Stream: stream.write가 false 반환 시 drain까지 쓰기 중단
  • TCP: 윈도우 사이즈 축소로 전송량 감소

B. 버퍼링 Buffering

  • 큐로 일시적 완충
  • 메모리·스토리지 한계 존재, 포화 시 조절 또는 드롭과 병행 필요

C. 드롭 Dropping/Sampling

  • 최신성 우선 시 과거 데이터 폐기
  • 영상 스트리밍에서 느린 네트워크 구간의 과거 프레임 건너뛰기
  • RxJS 연산자 throttleTime, debounceTime, sample을 통한 이벤트 솎아내기

기술별 적용 예시

  • RxJS
    • debounceTime(1000)으로 1초 내 다수 입력을 마지막 1건만 처리해 드롭 구현
  • 큐 시스템 Redis 기반
    • 워커가 바쁠 때 작업을 가져오지 않고 큐에 대기시켜 버퍼링 수행, 소비자 확장으로 처리량 증가 가능
  • Node.js Streams
    • readable.pipe(writable) 구성 시 런타임이 자동 백프레셔 수행, writable이 밀리면 readable 읽기 속도 조절됨

간단 예시

읽기와 쓰기 스트림을 수동으로 연결할 때의 최소 패턴 예시

if (!writable.write(chunk)) {
  readable.pause()
  writable.once('drain', () => readable.resume())
}
  • write가 false면 쓰기 버퍼 포화 상태, drain 이후 재개
  • 자동 pipe를 쓰면 동일 패턴이 내부 처리됨

주의와 베스트 프랙티스

  • 버퍼는 유한, 포화 전제 하에 드롭 또는 조절 정책 설계 필요
  • 드롭 기준은 도메인 의존, 최신성 vs 완전성 트레이드오프 명시
  • 네트워크 경계와 서비스 경계를 넘는 파이프라인에서는 백프레셔 신호가 단절되지 않도록 프로토콜·큐 정책 정합성 확보 필요
  • 모니터링 지표 권장: 큐 길이, 처리 지연 percentile, 메모리 사용량, 드롭율, 재시도율

요약

  • 정의: 느린 소비자가 빠른 생산자에 속도 제한을 요구하는 흐름 제어 메커니즘
  • 목적: OOM 방지, 지연 통제, 시스템 안정성 확보
  • 방법: 조절 Control, 버퍼링 Buffer, 드롭 Drop의 조합으로 파이프라인 균형 유지

참고자료