IT/Reactive Streams

Reactive Streams

밝은내일 2020. 11. 19. 22:49
반응형

Overview

WebFlux를 제대로 이해하기 위해선 Reactive Streams를 이해할 필요가 있습니다. Reactive Streams는 reactive-streams.org에서 아래와 같이 정의하고 있습니다.

Reactive Streams is a standard for asynchronous data processing in a streaming fashion with non-blocking back pressure.
Reactive Streams은 논블로킹(Non-blocking), 백 프레셔(Back Pressure)를 이용한 비동기 데이터 처리의 표준입니다.

논블로킹(Non-blocking), 백 프레셔(Back Pressure)는 이미 블로그에 있는 내용이니 참조하시면 좋겠습니다.

Reactive Streams Flow

Reactive Streams은 Subscriber, Publisher, Subscription 세 인터페이스로 동작하며 일반적인 처리흐름 알아봅시다.

Subscribe Streams(스트림 구독하기)

  1. Subscriber는 Publisher를 구독합니다. (이제 Publisher는 구독을 요청한 Subscriber를 알고 있습니다.)
  2. Publisher는 Subscriber에게 Subscription을 전달합니다.

2번 단계에서 전달된 Subscription은 Subscriber-Publisher간 통신매체가 됩니다. Subscriber는Publisher에게 직접 데이터 요청을 하지 않고 Subscription을 통해 요청합니다.

After Subscribe(스트림 구독 후)

  1. Subscriber는 작업에 필요한 데이터를 Subscription을 걸쳐 Publisher에게 전달합니다.
  2. Publisher는 요청한 데이터를 Subscription을 통해 Subscriber로 전달합니다.

Publisher는 Subscriber가 요청한 갯수만큼의 데이터를 onNext메서드를 통해 전달합니다. 더 이상 Publisher에서 제공할 데이터가 없다면 onComplete메서드로 작업의 완료를 Subscriber에게 알립니다. 만약 어떤 문제가 발생한다면 onError 메서드를 호출하여 Subscriber에게 상황을 알립니다.

Reactive Streams Core Interfaces

Subscriber

Subscriber는 Publisher로 부터 전달된 데이터를 받아 처리합니다. observer pattern에 관점에서는 Observer 역할을 합니다.

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

onSubscribe메서드는 Publihser와 구독관계를 맺을시 Publisher가 매개변수로 Subscription을 받습니다. onNext는 Subscriber가 받은 데이터를 한건씩 처리하기 위한 메서드입니다. 그리고 여러번 호출될 수 있습니다. (물론 여러번 호출 되기 전 onSubscribe가 한번은 반드시 호출되야 합니다.) onError 또는 onComplete과 호출되면, Publisher가 데이터를 더 이상 보내지 않습니다. 아래 그림은 Subscriber의 메서드가 호출되는 횟수를 보여주는 그림입니다.

Publisher

Publisher는 자신을 구독한 Subscribers의 요구에 맞게 데이터를 Subscribers에게 보냅니다. 한 Publisher는 다수의 Subscribers에 대응할 수 있습니다. observer pattern에 빗대어 보면 Observable에 해당합니다.

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

subscribe메서드는 Subscriber가 특정 Publisher를 구독 하기위해 Publisher에서 제공하는 메서드입니다. 즉 Subscriber가 Publisher에 자신을 등록할때 사용합니다.

Subscription

Subscription은 Subscriber-Publisher간 통신매체가 됩니다.

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

request 메서드는 n개의 데이터를 Publisher에게 요청하기위한 메서드입니다. Subscriber는 Publisher에게 데이터를 요청하게 됩니다. cancel 메서드는 Subscriber의 구독을 취소할때 사용합니다.

반응형