Java9부터 표준으로 정의된 인터페이스이다. java.util.concurrent.Flow 라이브러리에 있음.

Java8까지는 org.reactivestreams 라는 별도 라이브러리로 관리되고 있었다.

이전까지 자바 진영에서는 비동기 파이프라인(스트림)처리 라이브러리들은 각자 따로만들어지고 있었다.

넷플릭스에서 RxJava, 스프링의 Pivotal팀에서는 Reactor, Lightbend에서 Akka Streams

이런 상황에서 자바 진영에서 비동기 파이프라인 처리 표준이 필요하다는 공감대가 생겼고, 이에 Reactive Streams 인터페이스가 생겨났다.

주 목적은 공통 인터페이스 정의하고, Backpressure 방법 표준화임.

참고로 Backpressure는 생산자-소비자 문제에서 소비자가 처리속도를 제어하게끔 하는 방식이다.

생산자가 소비자에 비해 너무 빨리 생산하면 버퍼가 금방 차게 되는데, Backpressure는 미리 소비자가 생산자에게 본인의 처리량을 알려서 생산자가 해당 처리량만큼만 생산하게끔 하는 방식임.

Reactive Streams의 인터페이스는 단 4개이다. 이중에서 Reactor를 사용하면 개발자는 Subscriber의 콜백만 구현해서 어떻게 데이터를 처리할지만 결정해주면 된다. 그리고 이것도 대부분 기본 구현은 이미 다 되어있기도 함.

이정도 구현만 진행하고, 사실 아래 코드도 WebFlux까지 더해지면 이정도도 안한다.

Flux.just(1, 2, 3)
    .subscribe(
        data  -> System.out.println(data),  // onNext
        error -> log.error(error),          // onError
        ()    -> System.out.println("완료") // onComplete
    );
// onSubscribe는 Reactor가 내부에서 처리
// request(Long.MAX_VALUE) 자동 호출

backpressure제어할때

Flux.range(1, 1000)
    .subscribe(new BaseSubscriber<Integer>() {
        protected void hookOnSubscribe(Subscription s) {
            request(10);  // Backpressure 직접 제어
        }
        protected void hookOnNext(Integer value) {
            process(value);
            request(1);
        }
    });

Publisher

데이터를 발행하는 생산자를 정의한다.