개발하는 두더지

[Rxjava2] Observable, Flowable 본문

Java,Android

[Rxjava2] Observable, Flowable

덜지 2018. 6. 14. 18:52

Rxjava 2.x의 위키에 ObservableFlowable의 선택 기준이 공개되어있습니다.


Observable을 선택하는 기준

- 최대 1000개 미만의 데이터 흐름, Out of Memory Exception 이 발생할 확률이 적은 경우

- 마우스, 터치 이벤트를 다루는 GUI 프로그래밍, 초당 1000회 이하의 이벤트를 다룸


Flowable을 선택하는 기준

- 10000개 이상의 데이터를 처리하는 경우, 메서드 체인에서 데이터 소스에 데이터 개수 제한을 요청해야 함

- 디스크에서 파일을 읽어 들일 경우

- JDBC를 활용해 데이터베이스의 쿼리 결과를 가져오는 경우

- 네트워크 I/O를 실행하는 경우 ( 서버에서 가져오길 원하는 만큼의 데이터양을 요청할 수 있을 때 )


디스크, 네트워크에서 I/O, 데이터베이스 쿼리 결과 가져오기 등은 Cold Observable 입니다. Cold Observable은 데이터를 조금씩 가져오는 것이 아니라 한번에 가져옵니다. 이 경우 반드시 Flowable을 써야하는 것은 아니고 배압의 이슈가 작다( 발행속도와 처리속도 차이가 작을 때 )면 Observable을 활용해도 됩니다.

데이터 발행과 처리 속도가 차이나더라도 흐름 제어 함수 ( sample(), throttle(), debounce() ) 를 활용하고

어려울 경우 Flowable을 사용하면 됩니다.



Flowable을 활용한 배압 이슈 대응

- onBackpressureBuffer()  배압 이슈가 발생하면 버퍼에 저장

- onBackpressureDrop()   배압 이슈가 발생하면 데이터 무시

- onBackpressureLatest()  처리할 수 없어서 쌓이는 데이터를 무시하면서 최신 데이터만 유지


배압이슈(Backpressure Issue)란?

Hot Observable을 처리할 때 업스트림에서 데이터 발행과 다운스트림에서 데이터를 처리하는 속도의 차이가 현저한 경우 발생하는 문제

Rxjava 2.x 는 Flowable 클래스의 배압 이슈 대응 메서드를 이용하여 처리합니다. 하지만 이슈가 근본적으로 해결되는 것은 아닙니다. 

오히려 흐름 제어 메서드 ( sample, throttle, debounce, buffer )를 이용하여 처리하는 것이 더욱 현명한 방법입니다.




참고

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에


Comments