IT기술/webflux (reactor)

[WebFlux] Backpressure란? – 리액티브 데이터 흐름 제어의 핵심

후스파 2025. 4. 27. 12:35
반응형

spring webflux reactor

Backpressure(배압)는 리액티브 프로그래밍에서 데이터 생산자(Publisher)와 소비자(Subscriber) 간의 흐름 제어 메커니즘입니다. 시스템이 데이터 과부하를 방지하고 안정성을 보장하기 위해 반드시 이해해야 하는 개념입니다.

 


 

1. Backpressure가 필요한 이유

 

문제 상황

  • 빠른 Publisher vs 느린 Subscriber
    Publisher가 초당 10,000개 데이터를 emit하는데, Subscriber가 초당 100개만 처리 가능 → 처리되지 않은 데이터가 쌓이면서 메모리 오버플로우 발생 가능

 

해결 방안

  • 역압 적용: Subscriber가 처리 가능한 만큼만 데이터 요청
    "1개 처리 완료 → 다음 1개 요청" 방식으로 시스템 과부하 방지

 


 

2. Reactor의 Backpressure 전략

 

주요 전략 비교

전략 설명 사용 시나리오
BUFFER 버퍼에 데이터 임시 저장 (기본값) 짧은 버스트 트래픽 처리
DROP 버퍼 가득 찰 시 새로운 데이터 버림 실시간 스트리밍 (일부 데이터 손실 허용)
LATEST 최신 데이터만 유지하고 이전 데이터 버림 실시간 모니터링
ERROR 버퍼 가득 찰 시 에러 발생 긴급 장애 감지
IGNORE Backpressure 무시 (비권장) 테스트 환경

 


 

3. 실제 구현 예제

 

1) 기본 요청 제어 (BaseSubscriber)

Flux.range(1, 100)
    .subscribe(new BaseSubscriber() {
        @Override
        protected void hookOnSubscribe(Subscription subscription) {
            request(3);  // 초기 3개 요청
        }

        @Override
        protected void hookOnNext(Integer value) {
            process(value);  // 데이터 처리
            request(1);      // 1개씩 추가 요청
        }
    });

 

2) 전략적 Backpressure 적용

// DROP 전략: 처리 못할 데이터 버림
Flux.range(1, 1000)
    .onBackpressureDrop(dropped -> 
        log.warn("Dropped: {}", dropped))
    .subscribe();

// BUFFER 전략: 최대 50개 버퍼링
Flux.interval(Duration.ofMillis(10))
    .onBackpressureBuffer(50, 
        OverflowStrategy.DROP_OLDEST)
    .subscribe();

 

3) 스레드 관리 (publishOn)

Flux.range(1, 100)
    .publishOn(Schedulers.boundedElastic(), 10)  // prefetch=10
    .subscribe(data -> {
        // 병렬 처리
    });

 


 

4. Spring WebFlux 적용 팁

 

1) 컨트롤러 레벨 제어

@GetMapping("/stream")
public Flux streamData() {
    return dataService.getDataStream()
        .onBackpressureBuffer(100);  // 최대 100개 버퍼
}

 

2) 글로벌 설정 (application.yml)

spring:
  reactor:
    prefetch: 32  # 기본 prefetch 값 조정

 

3) 모니터링 지표

@Bean
public MeterRegistryCustomizer metrics() {
    return registry -> 
        FluxProcessor.METRIC_BUFFER_SIZE.register(registry);
}

 


 

5. 성능 최적화 가이드

  1. prefetch 값 튜닝: 너무 작으면 처리량 ↓, 너무 크면 메모리 ↑
    (기본값 256 → 서비스 특성에 맞게 조정)
  2. 백프레셔 전략 선택 기준:
    • BUFFER: 금융 거래 내역 조회
    • DROP: 실시간 센서 데이터 수집
    • LATEST: 주식 시세 모니터링
  3. 병목 현상 분석:
  4. .metrics() .doOnNext(data -> log.debug("Processing: {}", data))

 


 

결론

Backpressure는 리액티브 시스템의 핵심 안전장치입니다. WebFlux와 Reactor에서 제공하는 다양한 전략을 이해하고, 시스템 특성에 맞게 적절히 적용하면 고성능 + 안정성을 동시에 확보할 수 있습니다. 데이터 처리량, 지연 시간, 장애 허용 범위 등을 고려해 최적의 전략을 선택하세요.

 

 

[WebFlux] Backpressure란?

Backpressure(배압)은 데이터 스트리밍 환경에서 발생하는 개념 데이터 생산자(publisher)와 소비자(subsc...

blog.naver.com

 

 

WebFlux Cold Sequence와 Hot Sequence: 데이터 흐름의 두 가지 방식

리액티브 프로그래밍에서 Cold Sequence와 Hot Sequence는 데이터 발행 방식을 결정하는 핵심 개념입니다. 이 두 방식은 구독자(Subscriber)와의 관계와 데이터 처리 타이밍에 근본적인 차이를 가지며, Spri

hoosfa.tistory.com

 

반응형