ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Webflux] #1 Reactive Streams 이해하기
    개발 2023. 2. 25. 16:39

    Spring Webflux에서 비동기 로직을 지원하기 위해 사용되는 Reactor 라이브러리는 Reactive Stream의 구현체이다.

    Reactor 라이브러리를 보기에 앞서, Reactive Streams을 공부하려 한다.

    Reactive Streams?

    Reactive Streams는 non-blocking backpressure를 이용한 비동기 스트림 처리를 위한 표준을 뜻한다.

     

    Backpressure: 시스템의 한 컴포넌트(생성자)가 데이터를 생성하는 속도가 다른 컴포넌트(소비자)가 데이터를 소비하는 속도를 초과할 때 발생하는 압력

     

    Non-blocking backpressure: 컴퓨터 네트워크와 분산 시스템에서 과부하와 혼잡을 방지하기 위한 컴포넌트 간의 데이터 흐름을 제어하는 기술. 소비자 컴포넌트가 생성되는 데이터의 속도를 따라잡을 수 없더라도 생성자 컴포넌트가 계속 데이터를 생성한다. 생산자를 blocking(차단)하지 않고 데이터의 흐름을 늦추거나 버퍼링하는 등의 방법으로 속도를 조절한다.

     

    API Components

    Reactive Stream API는 Reactive Stream 구현을 위해 필요한 아래의 4가지 컴포넌트로 이루어져있다.

     

    1. Publisher

    public interface Publisher<T> {
        public void subscribe(Subscriber<? super T> s);
    }

    Publisher(발행자)는 Subscriber(구독자)가 필요로 하는 만큼 데이터를 발행한다.

     

    subscribe 메소드를 통해 구독자가 발행자를 구독한다.

     

    2. Subscriber

    public interface Subscriber<T> {
        public void onSubscribe(Subscription s);
        public void onNext(T t);
        public void onError(Throwable t);
        public void onComplete();
    }

    Subscriber(구독자)는 Subcription 객체를 통해 Publisher(구독자)에게 받은 데이터를 전달 받는다.

     

    onSubscribe 메소드를 통해 Subscription 객체를 생성하거나 관리한다.

     

    Subcription은 발행자에게 받은 데이터를 구독자에게 전달하는데,

    onNext 메소드를 호출함으로써 데이터를 전달할 수 있고,

    모든 데이터가 전달 되었으면 onComplete 메소드가 호출되며

    오류가 날 경우에는 onError 메소드가 호출된다.

     

    3. Subscription

    public interface Subscription {
        public void request(long n);
        public void cancel();
    }

    Subscription(구독)은 Publisher(발행자)-Subcriber(구독자)간의 데이터 교환을 중재한다.

     

    request 메소드를 통해 데이터를 요청하는 횟수를 지정하고

    cancel 메소드로 구독을 취소할 수 있다.

     

    4. Processor

    public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
    }

    Processor은 복잡한 데이터 파이프라인을 만드는 데 핵심 요소이다.

    발행자에 대한 구독자이면서, 구독자에 대한 발행자이기도 하다.

    이를 통해 데이터를 수신하고 데이터 처리 로직을 적용한 후 데이터를 전달할 수 있게 한다.

     

    Processor의 예시로는 map, filter, reduce 같은 연산자가 있다.

     

    정리

    1. Publisher는 데이터를 발행한다.

    2. Subscriber은 데이터를 받는다.

    3. Publisher-Subscriber간의 데이터 전달은 Subscription 객체를 통해 이루어진다.

    4. Processor 객체를 통해 Publisher와 Subscriber를 한번에 관리하는 데이터 파이프라인을 구현할 수 있다.

     

    Reactive Streams는 Publisher가 Subscriber에게 데이터를 전달하는 Push-based 방식이며, back pressure을 사용해서 Publisher에게 데이터를 요청할 데이터의 양을 알려주기만 하는 방식으로 작동한다. (그래서 pull-based 가 아니다)

    참고

    https://github.com/reactive-streams/reactive-streams-jvm

Designed by Tistory.