[Spring WebFlux] Reactive Streams란

MEUN·2021년 12월 5일
0

Reactive Streams

개요

  • 라이브러리 및 프레임워크에 상관없이 데이터 스트림을 비동기로 다룰 수 있는 공통 메커니즘이며, 이 메커니즘을 편리하게 사용할 수 있는 인터페이스 제공
    (참고 : Reactive Streams)
  • 인터페이스만 제공하며, 구현은 각 라이브러리와 프레임워크에서 수행
    (참고 : Reactive Streams Specification for the JVM)

구성

  • Publisher : 데이터를 만들어 통지하는 생산자
  • Subscriber : 데이터를 받아 처리하는 소비자

제공 프로토콜

PublisherSubscriber는 아래 4개의 프로토콜로 데이터를 통지함

  • onSubscribe : 데이터 통지가 준비됐음을 통지
  • onNext : 데이터 통지
  • onError : 에러(이상 종료) 통지
  • onComplete : 완료(정상 종료) 통지

제공 인터페이스

[이미지 1] reactive-streams-1.0.3.jar 내 인터페이스
reactive-streams-1.0.3.jar 내 인터페이스

  • Publisher : 데이터를 생성하고 통지
package org.reactivestreams;

public interface Publisher<T> {
    public void subscribe(Subscriber<? super T> s);
}
  • Subscriber : 통지된 데이터를 전달받아 처리
package org.reactivestreams;

public interface Subscriber<T> {
   
    public void onSubscribe(Subscription s);

    public void onNext(T t);

    public void onError(Throwable t);

    public void onComplete();
}
  • Subscription : 데이터 개수를 요청하고 구독을 해지
package org.reactivestreams;

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

    public void cancel();
}
  • Processor : PublisherSubscriber의 기능이 모두 존재하는 인터페이스
package org.reactivestreams;

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

규칙

Reactive Streams는 위의 인터페이스로 데이터를 통지하는 구조를 제공하는데, 이 구조가 정상적으로 작동하려면 Reactive Streams의 규칙을 준수해야 함


기본 규칙

  1. 구독 시작 통지(onSubscribe)는 해당 구독에서 한 번만 발생
  2. 통지는 순차적으로 이루어짐, 여러 통지를 동시에 수행할 수 없음
  3. 데이터 및 에러 통지 시 NULL을 통지하지 않음
  4. Publisher의 처리는 완료(onComplete) 또는 에러(onError)를 통지해 종료

Subscription의 추가 규칙

  1. 데이터 개수 요청에 Long.MAX_VALUE를 설정하면 데이터 개수에 의한 통지 제한은 없어짐
  2. Subscription의 메서드는 동기화된 상태로 호출되어야 함, 메서드를 동시에 호출해서는 안됨

보다 세부적인 규칙이 많지만 위의 규칙에 따라 구현할 경우 자동으로 지켜지며, 자세한 규칙은 아래 링크를 통해 확인이 가능하다.
(참고 : reactive-streams-jvm/README.md)


리액티브 프로그래밍

  • 데이터가 통지될 때마다 관련 프로그램이 반응해 데이터를 처리하는 프로그래밍 방식
  • 리액티브 시스템은 리액티브 프로그래밍으로 구현된 시스템이 아님

    리액티브 시스템이란 메시지를 보내 데이터를 처리하고 상황에 따라 스케일 아웃과 스케일 인을 자동으로 수행해 장애 내성을 높임으로써 항상 빠르게 응답할 수 있는 시스템을 말한다.


📗 참고 서적

  • RxJava 리액티브 프로그래밍

0개의 댓글