본문 바로가기

학습/WebFlux

Backpressure

📚 이전학습

🌊 WebFlux Backpressure 정리

📖 Backpressure란?

백프레셔는 데이터 소비자가 데이터를 생산자보다 빠르게 처리할 수 없을 때 발생하는 문제를 관리하기 위한 메커니즘입니다.
Reactive Streams 표준에서 중요한 개념으로, 생산자와 소비자 간의 데이터 처리 속도를 조정하여 시스템 안정성을 보장합니다.


🎯 백프레셔의 주요 목표

  1. 데이터 과부하 방지
    소비자가 처리할 수 없는 양의 데이터를 제공하지 않도록 조율.
  2. 시스템 안정성 향상
    처리량을 조정하여 OOM(OutOfMemory)과 같은 문제 방지.
  3. 효율적인 리소스 사용
    CPU, 메모리 등 자원을 최적으로 활용하여 병목현상 최소화.

📚 Backpressure를 알기 전 필요한 개념

  • Buffer의 개념
    • PublisherSubscriber 사이에 존재하는 버퍼가 있음을 알아야한다.
    • 버퍼는 데이터를 임시로 저장하는 공간이다.
    • 버퍼는 데이터를 저장하고 소비자가 처리할 수 있을 때 까지 데이터를 보관한다.
      1. 아래 그림 순서대로 Publisher(Flux,Mono) 에서 데이터가 emit 된다.
      2. 이때 emit 된 데이터는 버퍼에 저장된다.
      3. 소비자가 데이터를 "소비할 수 있을 때 까지" 버퍼에 데이터가 보관된다.
      4. 사용자가 데이터를 소비할때 버퍼에 데이터가 있으면 버퍼에서 데이터가 onNext(emit) 된다.
      (중요) 이러한 버퍼개념을 알아야 Backpressure를 이해할 수 있다.


⚙️ Backpressure의 동작 원리

  • 소비자 요청 기반 처리
    • 소비자가 처리할 수 있는 데이터 개수를 생산자에게 요청(request(n))하고, 생산자는 해당 개수만큼 데이터를 전송.
  • Publisher-Subscriber 관계
    • Publisher는 데이터를 생성하는 주체.
    • Subscriber는 데이터를 소비하는 주체.
    Reactive Streams 표준에서는 PublisherSubscriber의 처리 속도에 맞춰 데이터를 공급합니다.

🚦 백프레셔 전략

Reactive Streams에서 다양한 백프레셔 전략이 제공되며, 상황에 따라 적절한 방법을 선택해야 합니다.

1. Drop

  • 소비자가 처리할 수 없는 데이터는 버림.
  • 빠른 데이터 처리가 필요하지만 데이터 유실을 감수할 수 있을 때 유용.

2. Latest

  • 소비자가 처리 중일 때 최신 데이터로 덮어쓰기.
  • 이전 데이터는 무시되고 최신 데이터만 유지.

Buffer에 넣어지기 전 대기중인 데이터기준 가장 최근 데이터만 수용

3. Buffer

  • DownStream으로 전달할 데이터가 버퍼에 가득 찰 경우, 버퍼안에 데이터를 버리는 전략.
  • 가득 찬 버퍼Flux,Mono 에서 emit 된 데이터가 들어올 경우 Buffer Overflow 발생.
    이때, Buffer Overflow 발생으로 데이터가 버려지는 전략.
  • Buffer 전략은 2가지로 구분된다.

1) Buffer Drop-Latest

  • 가장 최근에 들어온 데이터를 버리는 전략.

Buffer Over Flow 에러 감지 이후에 대한 전략

2) Buffer Drop-Oldest

  • 가장 오래된 데이터를 버리는 전략.

Buffer Over Flow 에러 감지 이후에 대한 전략

4. Error

  • 데이터 초과 상황 발생 시, 에러를 발생시켜 처리 중단.
  • 데이터 유실 없이 실패를 명확히 전달해야 할 때 적합.

📌 백프레셔가 필요한 경우

  • 실시간 데이터 스트림 처리.
  • 생산자와 소비자 간 속도 불균형.
  • 메모리 자원의 효율적 사용이 중요한 경우.
  • 대규모 데이터 처리 파이프라인.

🛠️ Spring WebFlux에서의 Backpressure

Spring WebFlux는 Reactor를 기반으로 동작하며, 백프레셔를 자연스럽게 지원합니다.
FluxMono와 같은 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