[리액티브 스트림즈(Reactive Streams)] Publisher, Subscriber, Subscription, Processor 4개 인터페이스 소개
Language/Reactive

[리액티브 스트림즈(Reactive Streams)] Publisher, Subscriber, Subscription, Processor 4개 인터페이스 소개

728x90
반응형

리액티브 스트림즈(Reactive Streams)란?


  • 리액티브 프로그래밍 라이브러리의 표준 사양이다. (github.com/reactive-streams/reactive-streams-jvm/ )
  • RxJava는 이 Reactive Streams의 인터페이스들을 구현한 구현체임.
  • Reactive Streams는 Publisher, Subscriber, Subscription, Processor 라는 4개 인터페이스를 제공한다.

 

 

1. Publisher(생성자) : 데이터를 생성하고 통지(내보냄)한다. 

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

Publisher인터페이스 사용시 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();
}

onSubscribe()는 데이터를 최초 통지할때 호출되는 함수 (Subscripntion 객체로 데이터 구독 요청 및 해지 요청)

onNext()는 데이터를 통지할때마다 호출되는 함수

onError() 는 데이터를 통지할때 에러가 발생할때 호출되는 함수

onComplete() 는 데이터 통지가 끝났음을 알리는 함수

 

 

 

3. Subscription : 전달 받을 데이터의 개수를 요청하고 구독을 해지한다. 

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

request()는 데이터 구독 요청 (데이터 갯수로)

cancel()는 데이터 구독취소 

 

4. Processor : Publisher와 Subscriber의 기능이 모두 있음. 

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

}

 

 

4개 인터페이스 클래스 다이어그램

 

 

 

 

 


Publisher와 Subscriber간의 프로세스 흐름


 

기본 구조는

Publisher는 데이터를 생성하고 통지하고

Subscriber는 데이터를 구독하고 요청 한다. 

이때 대기중인 데이터를 어떻게 처리할지에 대한 전략을 배압(backpressure)전략이라 한다.

 

 

 

자세한 데이터 통신 흐름을 살펴보면 다음과 같다

 

소비자가 생상자가 통지한 데이터를 구독한다

Publisher는 데이터 통지가 준비되었음을 알린다. 

소비자는 전달받을 통지 데이터 갯수를 요청한다.

생산자는 요청받은 갯수만큼 데이터를 통지한다.

그 와중에 생산자는 비동기적으로 데이터를 생성하고있고.

이과정을 완료 또는 에러가 발생할때까지 , 데이터 생성, 통지, 요청이 계속된다.

 

 

동일한 과정을 다시 살펴보자

 

단일 Subscription

  1. [Publisher, 생산자]가 [Subscriber,소비자]를 subscribe(등록)한다.
  2. 동시에 [Subscriber, 소비자]가 [Subscription, 전달자]을 onSubscribe(등록)한다
  3. Subscriber(소비자)는 필요할 때 Subscribe(전달자).request(요청)을 통해 Publisher에게 데이터를 요청한다.
  4. Publisher(생산자)는 요청을 받으면 생성한 데이터를 보낸다
  5. Subscriber는 onNext로 데이터를 받는다.
  6. 모든 요청이 성공적으로 완료되면 onComplete을 호출하고 흐름을 종료한다.
  7. 요청이 실패하면 onError를 호출하고 흐름을 종료한다.

 

다중 Subscription

  • Publisher는 여러개의 Subscriber를 subscribe(등록)할 수 있다.
728x90
반응형