백프레셔(Backpressure)

아현·2025년 1월 8일
0

Computer Science

목록 보기
61/63

1. Backpressure 란?


프로그래밍에서 백프레셔(Backpressure)는 데이터 스트림 처리 시스템에서 생산자(Producer)소비자(Consumer) 간의 처리 속도 차이로 인해 발생하는 과부하 상태를 관리하는 개념을 의미합니다.

  • 생산자(Producer): 데이터를 생성하거나 전송하는 주체

  • 소비자(Consumer): 데이터를 처리하거나 소비하는 주체

백프레셔는 생산자가 소비자의 처리 속도보다 빠르게 데이터를 생성할 때 발생합니다. 이로 인해 소비자가 데이터를 처리하지 못하고 쌓이게 되는 문제가 발생합니다.

  • 백프레셔의 예시

    • 네트워크 프로그래밍

      • 서버가 클라이언트 요청을 빠르게 받아들이지만 처리 속도가 느리면 큐가 가득 차는 문제가 발생.
    • 스트리밍 시스템

      • Apache Kafka 또는 RabbitMQ 같은 메시지 큐에서 소비자가 메시지를 빠르게 처리하지 못하면 큐가 과부하 상태에 빠짐.
    • 비동기 프로그래밍

      • Node.js에서 이벤트 루프가 처리 속도를 따라가지 못하면 처리 지연(Delay) 발생.



2. Backpressure 관리 기법


  1. 큐 기반 버퍼링(Buffering)

    • 데이터를 큐에 저장하고 소비자가 처리할 수 있는 만큼만 데이터를 제공.
      큐가 가득 차면 데이터를 거부하거나 생산 속도를 늦춤.

    • 예: RabbitMQ의 채널 흐름 제어

  2. 속도 제어(Throttling)

    • 일정 시간 동안 처리할 수 있는 데이터 양을 제한하여 생산 속도를 줄임.

    • 예: RxJS의 throttleTime() 연산자

  3. 신호 전달(Signaling)

    • 소비자가 처리할 수 없는 경우 신호(ACK/NACK)를 보내 생산자에게 속도를 조절하라고 요청.

    • 예: TCP의 흐름 제어(Window Size)

  4. 드롭 또는 우선순위 관리

    • 처리할 수 없는 데이터는 폐기(Drop)하거나 우선순위 기반 처리를 통해 중요한 데이터부터 처리.

    • 예: 메시지 큐에서 낮은 중요도 메시지 폐기



3. 예시 코드


const fs = require('fs');

// 큰 파일을 읽고 스트리밍으로 처리
const readable = fs.createReadStream('largefile.txt');
const writable = fs.createWriteStream('output.txt');

// 백프레셔 관리
readable.on('data', (chunk) => {
  const isDrained = writable.write(chunk);
  if (!isDrained) {
    // writable이 가득 찼으면 읽기를 멈춤
    readable.pause();
  }
});

writable.on('drain', () => {
  // writable이 비워졌으면 읽기 재개
  readable.resume();
});
  • readable.pause()는 백프레셔가 발생했을 때 생산을 일시적으로 중단합니다.

  • writable.on('drain')은 소비자의 처리 공간이 생겼을 때 다시 데이터 처리를 재개합니다.

5. 결론


프로그래밍에서 백프레셔는 데이터 흐름 제어 메커니즘으로, 과부하 상태를 방지하고 시스템 안정성을 유지하기 위해 필수적입니다.

스트리밍 데이터 처리, 네트워크 프로그래밍, 이벤트 처리 시스템에서 백프레셔 관리는 성능 최적화와 데이터 손실 방지를 위해 자주 사용됩니다.


profile
For the sake of someone who studies computer science

0개의 댓글