📚 이전학습
🌊 WebFlux Backpressure 정리
📖 Backpressure란?
백프레셔는 데이터 소비자가 데이터를 생산자보다 빠르게 처리할 수 없을 때 발생하는 문제를 관리하기 위한 메커니즘입니다.
Reactive Streams 표준에서 중요한 개념으로, 생산자와 소비자 간의 데이터 처리 속도를 조정하여 시스템 안정성을 보장합니다.
🎯 백프레셔의 주요 목표
- 데이터 과부하 방지
소비자가 처리할 수 없는 양의 데이터를 제공하지 않도록 조율. - 시스템 안정성 향상
처리량을 조정하여 OOM(OutOfMemory)과 같은 문제 방지. - 효율적인 리소스 사용
CPU, 메모리 등 자원을 최적으로 활용하여 병목현상 최소화.
📚 Backpressure를 알기 전 필요한 개념
- Buffer의 개념
Publisher
와Subscriber
사이에 존재하는 버퍼가 있음을 알아야한다.- 버퍼는 데이터를 임시로 저장하는 공간이다.
- 버퍼는 데이터를 저장하고 소비자가 처리할 수 있을 때 까지 데이터를 보관한다.
- 아래 그림 순서대로
Publisher
(Flux,Mono
) 에서 데이터가emit
된다. - 이때
emit
된 데이터는 버퍼에 저장된다. - 소비자가 데이터를 "소비할 수 있을 때 까지" 버퍼에 데이터가 보관된다.
- 사용자가 데이터를 소비할때 버퍼에 데이터가 있으면 버퍼에서 데이터가
onNext(emit)
된다.
- 아래 그림 순서대로
⚙️ Backpressure의 동작 원리
- 소비자 요청 기반 처리
- 소비자가 처리할 수 있는 데이터 개수를 생산자에게 요청(
request(n)
)하고, 생산자는 해당 개수만큼 데이터를 전송.
- 소비자가 처리할 수 있는 데이터 개수를 생산자에게 요청(
- Publisher-Subscriber 관계
Publisher
는 데이터를 생성하는 주체.Subscriber
는 데이터를 소비하는 주체.
Publisher
가Subscriber
의 처리 속도에 맞춰 데이터를 공급합니다.
🚦 백프레셔 전략
Reactive Streams에서 다양한 백프레셔 전략이 제공되며, 상황에 따라 적절한 방법을 선택해야 합니다.
1. Drop
- 소비자가 처리할 수 없는 데이터는 버림.
- 빠른 데이터 처리가 필요하지만 데이터 유실을 감수할 수 있을 때 유용.
2. Latest
- 소비자가 처리 중일 때 최신 데이터로 덮어쓰기.
- 이전 데이터는 무시되고 최신 데이터만 유지.
3. Buffer
- DownStream으로 전달할 데이터가 버퍼에 가득 찰 경우, 버퍼안에 데이터를 버리는 전략.
- 가득 찬 버퍼로
Flux,Mono
에서emit
된 데이터가 들어올 경우Buffer Overflow
발생.
이때,Buffer Overflow
발생으로 데이터가 버려지는 전략. - Buffer 전략은 2가지로 구분된다.
1) Buffer Drop-Latest
- 가장 최근에 들어온 데이터를 버리는 전략.
2) Buffer Drop-Oldest
- 가장 오래된 데이터를 버리는 전략.
4. Error
- 데이터 초과 상황 발생 시, 에러를 발생시켜 처리 중단.
- 데이터 유실 없이 실패를 명확히 전달해야 할 때 적합.
📌 백프레셔가 필요한 경우
- 실시간 데이터 스트림 처리.
- 생산자와 소비자 간 속도 불균형.
- 메모리 자원의 효율적 사용이 중요한 경우.
- 대규모 데이터 처리 파이프라인.
🛠️ Spring WebFlux에서의 Backpressure
Spring WebFlux는 Reactor를 기반으로 동작하며, 백프레셔를 자연스럽게 지원합니다.Flux
와 Mono
와 같은 Reactive Stream 타입은 구독자(subscriber
)의 요청량을 기반으로 데이터를 전송합니다.
📋 Reactiveness와 Backpressure의 관계
- Reactive Programming은 비동기 처리와 데이터 스트림을 기반으로 하며, 백프레셔는 이 개념의 핵심입니다.
- 생산자-소비자 관계를 효율적으로 관리하여 시스템의 반응성을 유지합니다.
✅ 결론
백프레셔는 생산자와 소비자의 속도 차이를 해결하여 시스템의 안정성과 효율성을 유지하는 데 필수적입니다.
Spring WebFlux와 같은 Reactive Streams 기반 프레임워크는 이러한 문제를 자연스럽게 관리하며, 적절한 전략을 통해 백프레셔 문제를 해결할 수 있습니다.
참고: Reactive Streams 표준 문서 및 Spring WebFlux 공식 문서를 통해 추가적인 학습 가능.
예제소스코드 :
📚 참고 자료
🔗 GitHub Repository
•
자세한 학습 자료는 아래 GitHub 저장소를 참조하세요:
https://github.com/ses9892/learn_recator_programing/tree/main
'학습 > WebFlux' 카테고리의 다른 글
Scheduler (1) | 2024.12.02 |
---|---|
Sinks (0) | 2024.11.28 |
Recactor 용어정의 (1) | 2024.11.26 |
Reactor 란? (0) | 2024.11.26 |
Spring WebFlux란? (0) | 2024.11.26 |