Learn & Run

RxJava - Flowable과 Observable 이해하기 본문

Java

RxJava - Flowable과 Observable 이해하기

iron9462 2021. 1. 8. 00:36

목표

 

생산자인 Flowable과 Observable의 차이점을 이해해보도록 합니다.

 

 

 

Flowable vs Observable

 

 

1. Reactive Streams 인터페이스 구현 유무

 

  • Flowable은 Reactive Streams 인터페이스를 구현합니다.

Package를 보면 Reactive Streams인 것을 확인할 수 있습니다.

 

  • Observable은 Reactive Streams 인터페이스를 구현하지 않습니다.

ObservableSource의 Package를 보면 RxJava 3.x에서 독자적으로 제공하고있는 인터페이스인 것을 확인할 수 있습니다.

 

 

 

2. 데이터 처리

 

  • Flowable은 Subscriber라는 구독자로 데이터를 처리합니다.

 

  • Observable은 Observer라는 구독자로 데이터를 처리합니다.

 

 

 

3. 구독 해지

 

  • Flowable은 Subscription으로 구독을 해지합니다.
  • Observable은 Disposable로 구독을 해지합니다.

Flowable.subscribe()에서 통지된 데이터가 3일 때 구독을 해지하는 과정
Observable.subscribe()에서 통지된 데이터가 3일 때 구독을 해지하는 과정

 

Flowable은 Subscription, Observable은 Disposable을 사용하여 구독을 해지하지만 결과는 같습니다.

 

 

 

 

4. 배압(Back Pressure) 기능

 

  • Flowable은 배압 기능이 있기 때문에 Subscription으로 전달 받는 데이터의 개수를 제어할 수 있습니다.
  • Observable은 배압 기능이 없기 때문에 데이터의 개수를 제어할 수 없습니다.

* 배압이라는 것은 데이터를 통지하는 속도가 Subscriber에서 통지된 데이터를 전달받아 처리하는 속도보다 빠를 때 균형을 맞추기 위해 데이터의 통지량을 제어하는 기능을 의미합니다.

 

출처 : https://www.inflearn.com/course/자바-리액티브프로그래밍-1

 

  • 소스 코드 

생산자 측은 RxComputationThreadPool-2에서 데이터를 통지하는 것을 확인할 수 있고, 첫번째 데이터가 처리될 때 소비자 처리 대기 중 로그가 찍히고 Thread가 1초동안 멈추게 됩니다.
소비자 측은 RxComputationThreadPool-1에서 데이터를 처리하는 것을 확인할 수 있고, 생산자는 127까지 통지하고 더이상 통지하지 않습니다. 소비자 측에서는 생산자 측에서 통지한 데이터 0만 처리한 후  MissinBackpressureException이 발생한 것을 확인할 수 있습니다. 생산자 측에서 통지하는 속도가 소비자 측에서 처리하는 속도보다 월등히 빨라 Exception이 발생한 것을 의미합니다.