Cold vs Hot Observable
Observable은 Cold Observable과 Hot Observable로 나눌 수 있는 차이는 요약하자면 이렇다.
- Cold Observable: 생성된 이후 누군가 구독을 요청했을 때 '처음부터' 데이터 발행
- Hot Observable: 데이터 발행 시작한 이후 모든 구독자들에게 '같은' 데이터 발행
Cold Overservable
Cold Observable은 일반적인 옵저버 형태로, 누가 구독해주지 않으면 데이터를 배출해주지 않는 것을 원칙으로 한다.즉, Observable에 '구독' (subscribe)을 요청했을 때 데이터를 발행하기 시작한다. 즉, 누군가 구독을 하지 않으면 데이터를 발행하지 않는다. 또한 데이터를 처음부터 끝까지 발행하는 것을 보장한다.
같은 Stream이라는 Observable 인스턴스를 사용했음에도, Observer (Subscriber)마다 다른 Observable Stream이 생성되게 되어 있다. 유튜브 영상을 예시로 들 수 있다. 우리가 유튜브에 올라와 있는 영상을 볼 때, 다른 사람이 보던 부분부터 재생되는게 아니라 처음부터 영상이 재생된다. 이것이 Cold Observable이다.
따라서 실제로는 데이터를 요청하고 결과를 받는 네트워킹 (HTTP 요청 등) 동작, DB 트랜잭션 (쿼리) 등에 사용된다.
Cold Observer 예시
Observable src = Observable.interval(1, TimeUnit.SECONDS);
src.subscribe(value -> System.out.println("First: " + value));
Thread.sleep(3000);
src.subscribe(value -> System.out.println("Second: " + value));
Thread.sleep(3000);
First: 0
First: 1
First: 2
First: 3
Second: 0
First: 4
Second: 1
First: 5
Second: 2
첫 번째로 Observable을 구독하고, 3초 후에 새로운 구독자로 다시 구독한 모습이다. 옵저버블 인스턴스가 동일한지, 아닌지에 상관 없이 두 옵저버 모두 처음부터 (0부터) 발행하는 것을 볼 수 있다. 이런 옵저버블이 Cold Observable, 콜드 옵저버블이다. 같은 src 인스턴스를 사용했음에도 처음부터 시작하는 이유는 각각의 observer(관찰자)마다 다른 observable 소스가 생성되기 때문이다.
Hot Observable
Cold Observable과 다르게, 구독자의 존재 여부와 상관없이 데이터를 발행하는 녀석이다. 데이터 발행이 시작된 이후로 모든 구독자에게 동시에 같은 데이터를 발행한다. 구독을 늦게 했다면 데이터를 처음부터 받지 못한다. '나는 데이터 발행하고 있으니, 니들이 받든 말든 알아서 해라' 뉘양스이다.
유튜브 스트리밍(라이브)를 예시로 들 수 있다. 유튜버가 라이브를 키면 시청자들이 들어오든 말든 하는 것이다. 그리고 늦게 들어간 시청자는 앞 부분을 보지 못한다. 이것이 Hot Observable의 개념이다.
Hot Observer 예시
ConnectableObservable src =
Observable.interval(1, TimeUnit.SECONDS)
.publish();
src.connect();
src.subscribe(value -> System.out.println("First: " + value));
Thread.sleep(3000);
src.subscribe(value -> System.out.println("Second: " + value));
Thread.sleep(3000);
First: 0
First: 1
First: 2
First: 3
Second: 3
First: 4
Second: 4
First: 5
Second: 5
첫 번째 구독 시에 3초동안 0~2 아이템을 발행하고, 3초 뒤에 추가된 구독자는 이를 수신하지 못하며 3부터 수신하는 것을 볼 수 있다.
출처
[RxJava] Cold & Hot Observable (velog.io)
[Android] RxJava Cold Observable, Hot Observable (yena.io)
[RxJava] RxJava 이해하기 - 4. Hot Observable, Cold Observable - HERSTORY (4z7l.github.io)
'Android > RxJava' 카테고리의 다른 글
RxJava (7) - Observable 필터링하기 (0) | 2023.06.18 |
---|---|
RxJava (6) - Observable 변형하기 (0) | 2023.06.18 |
RxJava (4) - Single, Maybe, Completable (0) | 2023.06.18 |
RxJava (3) - Disposable 다뤄보기 (0) | 2023.06.18 |
RxJava (2) - Observable 생성하기 (0) | 2023.06.04 |