Java/일반

Reactive Stream

창욱씨 2020. 9. 9. 13:54

Reactive Stream이란

계속적으로 들어오는 스트림 데이터를 효율적으로 처리하기 위해서는 비동기 시스템이 효과적입니다. 비동기 처리를 하면서 가장 중요한 문제는 데이터 처리가 목적지의 리소스 소비를 예측가능한 범위에서 신중하게 제어할 수 있어야 하는 것입니다. 비동기는 네트워크를 통한 서버간의 협업 또는 단일 서버에서 컴퓨팅 리소스를 동시에 사용할 때 주로 사용됩니다.
Reactive Stream의 주된 목적은 비동기의 경계를 명확히 하여 스트림 데이터의 교환을 효과적으로 관리하는 것입니다. 즉, 비동기로 데이터를 처리하는 시스템에 어느 정도의 데이터가 들어올지 예측가능하도록 하는 것입니다. Reactive Stream에서는 BackPressure이 이를 달성할 수있게 해주는 중요한 부분입니다.

BackPressure

한 컴포넌트가 부하를 이겨내기 힘들 때, 과부하 상태인 컴포넌트에서 치명적인 장애가 발생하거나 제어 없이 메시지를 유실해서는 안 됩니다. 장애가 발생해선 안 되기 때문에 컴포넌트는 상위 컴포넌트들에 자신이 과부하 상태라는 것을 알려 부하를 줄여야 합니다. BackPressure은 시스템이 부하로 인해 무너지지 않고 정상적으로 응답할 수 있도록 만드는 중요한 방법입니다. BackPressure은 사용자에게까지 전달되어 응답성이 떨어질 수 있지만, 이 메커니즘은 부하에 대한 시스템의 복원력을 보장하고 시스템 자체가 부하를 분산할 다른 자원을 제공할 수 있는지 정보를 제공합니다.

Reactive Stream API의 구성요소

Publisher

Publisher는 데이터를 제공합니다. 제공된 데이터는 Subscriber가 구독하는 형식으로 처리됩니다.

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

Subscriber

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

Subscription

Subscription은 Publisher와 Subscriber 사이에서 중계하는 역할을 합니다.

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

Reactive Stream API Flow

  1. Publisher에 본인이 소유할 Subscription을 구현하고 publishing할 데이터를 만듭니다.
  2. Publisher는 subscribe() 메서드를 통해 subscriber를 등록합니다.
  3. Subscriber는 onSubscribe() 메서드를 통해 Subscription을 등록하고 Publisher를 구독하기 시작합니다. 이는 Publisher에 구현된 Subscription을 통해 이루어집니다. 이렇게 하면 Publisher와 Subscriber는 Subscription을 통해 연결된 상태가 됩니다.
  4. Subscriber는 Subscription 메서드의 request() 또는 cancel()을 호출해 데이터의 흐름을 제어합니다.
  5. Subscription의 request() 에는 조건에 따라 Subscriber의 onNext(), onComplete() 혹은 onError()를 호출합니다. 그러면 Subscriber의 해당 메서드의 로직에 따라 request() 또는 cancel()로 제어하게 됩니다.

참조: https://sabarada.tistory.com/98

728x90