카테고리 없음

리액티브 시스템 & Reactive Streams 정리

반응형
  • reactive: 어떤 이벤트나 상황이 발생했을 때, 반응을 해서 그에 따라 적절하게 행동하는 것.

리액티브 선언문

  • 방법
    • 메시지 구동: 리액티브 시스템에서 주요 통신 수단으로 비동기 메시지 기반의 통신을 통해 구성 요소들의 느슨한 결합, 격리성, 위치 투명성을 보장.
  • 형태:
    • 탄력성
      • 시스템의 작업량이 변화하더라도 일정한 응답을 유지하는 것.
      • 시스템으로 유입되는 입력이 많든 적든 간에 시스템에서 요구하는 응답성을 일정하게 유지하는 것.
    • 회복성
      • 시스템에 장애가 발생하더라도 응답성을 유지하는 것
      • 이러한 회복성을 확보하기 위해, 리액티브 시스템의 구성요소들은 비동기 메시지 기반 통신을 통해 느슨한 결합과 격리성을 보장.
    • 응답성
      • 비동기 메시지 기반 통신을 바탕으로 한 회복성과 탄력성을 확보함으로써 즉각적으로 응답 가능한 시스템을 구축할 수 있음을 의미.

 

리액티브 프로그래밍

  • 리액티브 시스템에서의 비동기 메시지 통신은 Non-Blocking I/O 방식의 통신입니다.
    • Blocking I/O 방식의 통신에서는 해당 스레드가 작업을 처리하려면 처리할 때 까지 남아있는 작업들은 해당 작업이 끝날 때 까지 차단되어 대기합니다.
    • 반면에 Non-Blocking I/O 방식의 통신에서는 스레드가 차단되지 않음.

 

리액티브 프로그래밍의 구성 요소

  • Publisher
    • 입력으로 들어오는 데이터를 Subscriber에 제공하는 역할을 수행.
  • Subscriber
    • Publisher로부터 전달받은 데이터를 사용하는 역할
  • Data Source
    • Publisher의 입력으로 전달되는 데이터를 의미
  • Operator
    • Publisher와 Subscrier 중간에서 데이터를 가공하는 역할.

 

Reactive Streams

  • 리액티브 라이브러리를 어떻게 구현할지 정의해둔 별도의 표준 사양.
    • 데이터 스트림을 Non-Bloking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양.
    • Reactive Streams를 구현한 구현체로는 Rxjava, Reactor, Akka Streasm, Java 9 Flow API 등이 존재.

 

Reactive Streams 구성요소

  • Publisher
    • 데이터를 생성하고 통지하는 역할
  • Subscriber
    • 구독한 Publisher로부터 통지된 데이터를 전달받아서 처리하는 역할
  • Subscription
    • Publisher에 요청할 데이터의 개수를 지정하고, 데이터의 구독을 취소하는 역할.
  • Processor
    • Publisher와 Subscriber의 기능을 모두 가지고 있다.

 

Publisher와 Subscriber의 기본 동작 과정

  • Subscriber는 전달 받을 데이터를 구독합니다. (subscribe)
  • Publisher는 데이터를 통지할 준비가 되었음을 Subscriber에게 알린다(onSubscribe)
  • Publisher가 데이터를 통지할 준비가 되었다는 알림을 받은 Subscriber는 전달받기를 원하는 데이터의 갯수를 Publisher에게 요청합니다 (Subscription.request)
    • Publisher가 통지하는 속도가 Publisher로부터 통지된 데이터를 Subscriber가 처리하는 속도보다 더 빠르면 처리를 기다리는 데이터는 쌓이게 되고, 이는 결과적으로 시스템 부하가 커지는 결과를 낳게 됨.
    • 이러한 문제를 해결하기 위해 Subscription.request를 통해 데이터 갯수를 제어하는 것.
  • 다음으로 Publisher는 Subscriber로부터 요청받은 만큼 데이터를 통지합니다 (onNext)
  • 이렇게 Publisher와 Subscriber 간에 데이터 통지, 데이터 수신, 데이터 요청 과정을 반복하다가 Publisher가 모든 데이터를 통지하게 되면 마지막으로 데이터 전송이 완료되었음을 Subscriber에게 알립니다. (onComplete). 만약에 Publisher가 데이터를 처리하는 과정에서 에러가 발생하면 에러가 발생했음을 Subscriber에게 알립니다(onError)

 

Reactive Streams Component

Publisher

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

Subscriber

public interface Subscriber<T> {
  void onSubscribe(Subscription s);
  void onNext(T t);
  void onError(Throwable t);
  void onComplete();
}
  • onSubscribe: 구독 시작 시점에 어떤 처리를 하는 역할을 수행
  • onNext: Publisher가 통지한 데이터를 처리하는 역할.
  • onError: Publisher가 데이터 통지를 위한 처리 과정에서 에러가 발생했을 때 해당 에러를 처리하는 역할.
  • onComplete: Publisher가 데이터 통지를 완료했음을 알릴 때 호출되는 메소드.

Subscription

public interface Subscription {
  void request(long n);
  void cancel();
}
  • Subscriber가 구독한 데이터의 개수를 요청하거나 데이터 요청의 취소 (구독 해지) 역할을 합니다.

Processor

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

}
  • Publsiher와 Subscriber의 기능을 모두 가지고 있음.
반응형