반응형

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. 성능 최적화 가이드
- prefetch 값 튜닝: 너무 작으면 처리량 ↓, 너무 크면 메모리 ↑
(기본값 256 → 서비스 특성에 맞게 조정) - 백프레셔 전략 선택 기준:
- BUFFER: 금융 거래 내역 조회
- DROP: 실시간 센서 데이터 수집
- LATEST: 주식 시세 모니터링
- 병목 현상 분석:
.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
반응형
'IT기술 > webflux (reactor)' 카테고리의 다른 글
| [WebFlux] Scheduler의 역할과 활용 방법 (0) | 2025.04.29 |
|---|---|
| [WebFlux] 리액티브 스트림즈 Sinks: 핵심 개념과 활용 가이드 (0) | 2025.04.28 |
| WebFlux Cold Sequence와 Hot Sequence: 데이터 흐름의 두 가지 방식 (0) | 2025.04.21 |
| [WebFlux] 마블 다이어그램(Marble Diagram): 리액티브 프로그래밍의 시각적 도구 (2) | 2025.04.12 |
| Reactor: Spring WebFlux의 리액티브 스트림즈 구현체 (4) | 2025.04.01 |