본문 바로가기

RxJava

[RxJava] Flowable과 Observable의 차이점

안녕하세요. 메로나입니다.

 

오늘은 Flowable과 Observable의 차이점을 공부하겠습니다.

 

Flowable과 Observable 차이점
Flowable Observable
Reactive Streams 인터페이스를 구현함 Reactive Streams 인터페이스를 구현 하지 않음
Subscriber에서 데이터를 처리 Observer에서 데이터를 처리
데이터 개수를 제어하는 배압 기능이 있음 데이터 개수를 제어하는 배압 기능이 없음
Subscription으로 전달 받는 데이터 개수를 제어할 수 있음 배압 기능이 없기 때문에 데이터 개수를 제어할 수 없음
Subscription으로 구독을 해지함 Disposable로 구독을 해지함

 

 

배압 기능이란?

Flowable에서 데이터를 통지하는 속도가 subscriber에서 통지된 데이터를 전달받아 처리하는 속도보다 빠를 때 밸런스를 맞추기 위해 데이터 통지량을 제어하는 기능을 말합니다.

즉. 한 생산과 소비의 속도를 맞추기 위함입니다. 속도가 차이 나면 에러가 납니다.

 

 

배압 전략법

1. missing 전략

  • 배압을 적용하지 않는다.
  • 나중에 onBackpressureXXX() 연산자를 사용하여 배압을 처리해야 합니다.
    • onBackpressureBuffer(): 생산된 데이터를 버퍼에 저장하여 소비자가 처리할 수 있게 대기합니다.
    • onBackpressureDrop(): 소비자가 데이터를 처리하는 속도가 느릴 경우, 새로운 데이터를 버립니다.
    • onBackpressureLatest(): 소비자가 데이터를 받을 준비가 될 때까지 가장 최근에 발행된 데이터만 유지하고 이전의 데이터는 버립니다.

2. Error 전략

  • 통지된 데이터가 버퍼의 크기를 초과하면 MissingBackpressureException() 에러를 통지합니다.
  • 소비자가 생산자의 통지 속도를 따라잡지 못할 때 발생합니다.

3. Buffer 전략

3-1. DROP_LATEST

  • 버퍼가 가득 찬 시점에 버퍼 내에서 가장 최근에 버퍼로 들어온 데이터를 drop 합니다.
  • drop 된 빈 자리에 버퍼 밖에서 대기하던 데이터를 채웁니다.

 

3-2. DROP_OLDEST

  • 버퍼가 가득 찬 시점에 버퍼 내에서 가장 먼저 들어온 데이터를 drop 합니다.
  • drop 된 빈자리에서 버퍼 밖에서 대기하던 데이터를 채웁니다.

drop-oldest 이미지

 

4. Drop 전략

  • 버퍼에 데이터가 모두 채워진 상태가 되면 이후에 생성되는 데이터를 DROP하고, 버퍼가 비워지는 시점에 DROP되지 않은 데이터부터 다시 버퍼에 채우는 전략입니다.

버퍼가 차서 drop 진행 중
버퍼의 데이터가 모두 통지되면 drop 되지 않은 데이터를 버퍼에 담음

 

 

5. Latest 전략

  • 버퍼에 데이터가 모두 채워진 상태가 되면 버퍼가 비어질 때까지 통지된 데이터는 버퍼 밖에서 대기하며 버퍼가 비워지는 시점에 가장 최근에 통지된 데이터부터 버퍼를 담는다.

latest - 생산 중
latest-버퍼 비워진 후 채워짐

 

 

공부를 하면서 배압을 잘 사용해야 데이터 관리를 잘할 수 있겠다는 생각이 들었습니다. 헷갈리는 내용이 많지만, 정리를 잘해서 협업에서도 자유롭게 사용할 수 있도록 하겠습니다!!!

 

참고 문헌

https://irontech.tistory.com/20

 

RxJava - 배압 전략(BackpressureStrategy)의 종류

목표 이전 포스팅에서 Flowable과 Observable의 차이를 알아보면서 배압이 무엇인지 알아보았습니다. 이번 포스팅에선 배압 전략에는 어떤 것들이 있는지 알아보고 간단한 소스 코드로 적용해봅니다

irontech.tistory.com

 

'RxJava' 카테고리의 다른 글

[RxJava] 생성 연산자  (0) 2025.01.30
[RxJava] Single vs Maybe vs Completable  (0) 2025.01.27
[RxJava] Reative Streams  (0) 2025.01.22
[RxJava] 마블 다이어그램  (0) 2025.01.19
[RxJava] 리액티브 프로그래밍  (0) 2025.01.19