BackPressure 와 Flowable

이성민·2024년 12월 23일
0

안드로이드

목록 보기
14/19

RxJava 기반 통신 작업을 회사에서 사용 중이지만 제대로 된 개념이 잡히질 않은 것 같아 공부를 하던 중 Observable 과 Flowable 를 선택하여 사용하는 기준에 대해 이해한 부분을 정리하고자 글을 써보기로 했다.

먼저 RxJava 가 무엇인지 부터 알아보자.

RxJava

RxJava 란 ReactiveX (Reactive Extentions) 를 자바로 구현한 라이브러리다. ReactiveX 는 Microsoft 사 주도 아래 옵저버 패턴, 이터레이터 패턴, 함수형 프로그래밍의 장점과 개념을 접목한 반응형 프로그래밍 기법을 의미한다.

과거의 어플리케이션은 클라이언트와 서버의 작업 간에 동기식 구조가 대부분이었다. 하지만 규모가 커지고 복잡해지면서 퍼포먼스 향상을 위해 비동기식 처리를 해야만 하는 시대가 도래하였다. RxJava 는 이러한 Reactive Programming 을 확장하여 구현한 라이브러리이다.

RxJava 의 가장 중요한 개념은 생산자와 소비자이다.

생산자 (Observable) : Data Stream 의 데이터를 발행하는 역할
소비자 (Observer) : 생산자의 데이터를 사용하는 주체

데이터 스트림을 데이터가 흐르는 강이라고 생각해본다면 이 곳에 데이터를 흘려보내는 주체가 생산자이고 떠내려오는 데이터를 받아서 처리하는 역할을 하는 것이 소비자 이다.

그런데 여기서 생산자와 소비자의 밸런스가 무너지게 된다면 어떻게 될까?

배압 (Back Pressure)

배압이란 데이터 생산과 소비가 불균형적일 때 일어나는 현상이다. 예를 들어 10,000개의 데이터를 0.1초마다 발행하고, 10초마다 소비를 하게 된다면 데이터는 스트림에 계속 쌓이게 될 것이다. 생산자가 데이터를 발행하는 속도를 소비자가 따라가지 못하는 것이다. 이는 결국 메모리가 Overflow 되고 Out of Memory 로 이어져 앱이 죽게 될 것이다.

이러한 현상을 배압이라고 하며 RxJava 에서는 배압 현상을 제어할 수 있는 방법을 제공한다.

Flowable

기존의 Observable 을 사용한 경우에는 데이터 발행과 소비가 균형적으로 일어나지 않으며 데이터는 소비와 상관없이 스트림에 계속 쌓이게 된다. 반면 Flowable 을 사용한 경우에는 데이터가 일정량 누적되면 배압 기능을 통해 데이터를 더 이상 발행하지 않도록 한다.

배압 전략

RxJava 에서는 배압 전략을 통해, Flowable 이 통지 대기 중인 데이터를 어떻게 다룰 지에 대한 스펙을 제공한다. 배압 전략에는 다음과 같은 것들이 있다.

  • Missing 전략
    - 배압을 적용하지 않는다.
    - 나중에 onBackPresureXXX() 로 배압을 적용할 수 있다.
  • Error 전략
    - 통지된 데이터가 버퍼의 크기를 초과하면 MissingBackPressureException 에러를 통지한다.
    - 소비자가 생산자의 통지 속도를 따라잡지 못할 때 발생한다.
    - 즉, MissingBackPressureException 이 발생한 것은 Flowable 의 기본 배압 전략이 Error 전략임을 의미한다.
  • Buffer 전략
    - DROP_LASTET
    버퍼가 가득 찬 시점에 버퍼 내에서 가장 최근에 버퍼로 들어온 데이터를 DROP 하고 빈 자리에 버퍼 밖에서 대기하던 데이터를 채운다.
    - DROP_OLDEST
    버퍼가 가득 찬 시점에 버퍼 내에서 가장 먼저 들어온 데이터를 DROP 하고 빈 자리에 버퍼 밖에서 대기하던 데이터를 채운다.
    - DROP
    버퍼가 가득 찬 시점 이후에 생성되는 데이터를 DROP 하고, 버퍼가 비워지는 시점에 DROP 되지 않는 데이터부터 다시 버퍼에 담는다.
    - LATEST
    버퍼에 가득 찬 시점이 되면 버퍼가 비워질 때까지 통지된 데이터는 버퍼 밖에서 대기하며 버퍼가 비워지는 시점에 가장 최근에 들어온 데이터를 채운다.
    - OLDEST
profile
Android Developer 이성민입니다

0개의 댓글