RxJava 배압(Backpressure) 이슈와 Flowable

2025. 1. 13. 16:24Android/도구 및 라이브러리

728x90
반응형

🌟 들어가기 전

안드로이드 개발자라면 누구나 익숙한 라이브러리인 RxJava.

RxJava는 비동기 데이터 처리와 반응형 프로그래밍을 위한 Java 라이브러리다.

(참고 링크 👉 https://anovice-dp.tistory.com/179)

 

데이터를 통신하는 과정에서 앱이 멈추지 않고 자연스럽게 흘러가며, UI가 변경되도록 도와준다.

이렇게 유용한 RxJava를 사용할 때 주의할 점 있다.

 

바로 배압 이슈.

Backpressure라고도 한다.

🔍 세부 내용

1. 배압이란?

데이터를 생산하는 속도데이터를 소비하는 속도불균형할 때 발생하는 문제이다.

생산자가 데이터를 너무 빨리 발행하고, 구독자가 이를 처리하지 못하면 데이터가 계속 누적되어 OOM 이슈가 발생한다.

2. Flowable로 관리하기

Flowable이란, RxJava에서 배압을 지원하는 데이터 스트림 타입이다.

(* 데이터스트림이란, 연속적으로 발생하는 데이터를 순차적으로 처리하는 방식)

RxJava에서 Observable은 배압을 지원하지 않아 적은 양의 데이터 처리에 적합하다.

반면 Flowable은 배압을 지원하여 대량의 데이터 스트림에 적합하다.

/* 배압을 지원하지 않는 Observable 소스코드 */

Observable.fromIterable(it.getData())
    .subscribeOn(Schedulers.computation()) // 데이터 발행은 computation 스레드에서
    .observeOn(AndroidSchedulers.mainThread()) // UI 업데이트는 메인 스레드에서
    .subscribe { info ->
        // 데이터 처리
    }
/* 배압을 지원하지 않는 Flowable 소스코드 */

Flowable.fromIterable(it.getData())
    .subscribeOn(Schedulers.computation()) // 데이터 발행은 computation 스레드에서
    .observeOn(AndroidSchedulers.mainThread()) // UI 업데이트는 메인 스레드에서
    .onBackpressureBuffer() // 배압 전략: 데이터를 버퍼에 저장
    .subscribe { info ->
        // 데이터 처리
    }
  • onBackpressureBuffer()는 배압 상황에서 데이터를 버퍼에 저장해 두는 방식. 소비자는 버퍼에서 데이터를 차례로 처리할 수 있다.

🤔 배운 점 & 느낀 점

나는 늘 Observable만 사용해와서 Flowable의 방법이 있는지조차 몰랐다.

비동기 식으로 데이터를 처리할 때는 메모리 초과 이슈에 가장 주목해야 할 것 같다.

현재 내가 관리하는 앱에도 OOM 이슈가 발생하였는데 한 번 체크해볼 것 ✔

728x90
반응형