Rx Cold & Hot Observable -3-

Cloud0·2021년 9월 13일
0
post-thumbnail

Hot & Cold Observable

그럼 Observable은 연속된 항목들을 언제 배출할까? 이 질문에 대한 대답은, "Observable에 따라 다르다"이다. “Hot” Observable은 생성되자 마자 항목들을 배출하기도 하기 때문에, 이 Observable을 구독하는 옵저버들은 어떤 경우에는 항목들이 배출되는 중간부터 Observable을 구독할 수 있다. 반대로, “Cold” Observable은 옵저버가 구독할 때 까지 항목을 배출하지 않기 때문에 이 Observable을 구독하는 옵저버는 Observable이 배출하는 항목 전체를 구독할 수 있도록 보장 받는다.

ReactiveX의 구현 코드 중에는 “연결 가능한(Connectable)” Observable이라고 불리는 Observable 객체가 존재하는데, 이 Observable은 옵저버의 구독 여부와는 상관 없이 자신의 Connect 메서드가 호출되기 전까지 항목들을 배출하지 않는다.

Cold Observable

Observable 에 '구독'을 요청했을 때 데이터를 발행하기 시작한다. 즉, 누군가 구독을 하지 않으면 데이터를 발행하지 않는다. 또한 데이터를 처음부터 끝까지 발행하는 것을 보장한다.

  • Subseribe(구독)을 요청하면 처음부터 데이터을 발행한다.
  • 일반적인 옵저버 형태를 말한다.
  • 누가 Subseribe 해주지 않으면 데이터를 배출해주지 않는다.
  • 일반적인 웹 요청, 데이터베이스 쿼리 등이 사용되며 내가 요청하면 결과를 받는 과정을 거친다.
  • 처음부터 발행하는 것을 기본으로한다.
    fun main() {
    val stream = Observable.interval(1, TimeUnit.SECONDS)
    stream.subscribe {
        println("First Subscriber : $it")
    }
    Thread.sleep(2000)
    stream.subscribe {
        println("Second Subscriber : $it")
    }
    Thread.sleep(2000)
    	
    }
    ---------------------------------
    First Subscriber : 0
    First Subscriber : 1
    First Subscriber : 2
    Second Subscriber : 0
    First Subscriber : 3
    Second Subscriber : 1
    
    첫 번쨰 구독자가 구독을 하고 2초 후에 두 번째 구독자가 구독을 하는 예시에서 두 번째 구독자가 구독을 시작했을 때, 첫 번째 구독자가 받을 '3' 이 발행되는 것이 아닌 처음부터 데이터가 발행 되는 것을 확인

Hot Observable

Observable을 생성하자마자 데이터을 흘려보낸다는 의미 그래서, Observable을 생성하고 시간이 지난 상태에서 subscribe하게 된다면 처음부터 아이템을 받아 보지는 못하고, 중간부터 나온 아이템들 부터 subscribe 할 수 있게 된다.

  • 데이터 발행이 시작된 이후로 모든 구독자에게 같은 데이터을 발행한다.

  • 구독자의 존재 여부와 상관없이 데이터를 배출하는 Observable이다.

  • 여러 구독자에 선택적으로 고려가 가능하다.

  • 구독 시점으로부터 발행하는 값을 받는 걸 기본으로 한다.

  • 마우스 이벤트, 기보드 이벤트, 시스템 이벤트 등이 주로 사용됨

  • 멀티캐스팅도 포함된다.

    fun main() {
    // 물론 ConnectableObservable 데이터 타입 생략 가능
    // publish() 를 붙이는 순간 Hot Observable 로 변환됨
    val stream: ConnectableObservable<Long> =
        Observable.interval(1, TimeUnit.SECONDS).publish()
    
    // connect() 가 호출될 때 곧바로 데이터 발행 시작
    stream.connect()
    
    stream.subscribe {
        println("First Subscriber : $it")
    }
    Thread.sleep(2000)
    stream.subscribe {
        println("Second Subscriber : $it")
    }
    Thread.sleep(2000)
    }
    ---------------------------------
    First Subscriber : 0
    First Subscriber : 1
    First Subscriber : 2
    Second Subscriber : 2
    First Subscriber : 3
    Second Subscriber : 3

    cold Observable 과 다르게 다른 구독자와 상관없이 발행하는 데이터를 계속 발행한다(second 의 첫 데이터가 2 인부분).
    유튜브 라이브 스트리밍 과 비슷하게 유튜버가 라이브를 키면 중간에 들어온 시청자는 앞부분을 보지못한다.

    REFERENCE

  • H43RO

  • 탤로우 월드

  • yena

  • ReactiveX

profile
이...사...중......

0개의 댓글