Cold Sequence, Hot Sequence

jjunhwan.kim·2023년 12월 23일
0

스프링

목록 보기
10/10
post-thumbnail
post-custom-banner

개요

리액티브 프로그래밍에서 Cold와 Hot의 의미를 알아봅니다.

Cold와 Hot의 의미

  • 사전적 의미로 Cold와 Hot의 의미는 '차가운, 추운', '뜨거운, 더운' 입니다. 하지만 컴퓨터 시스템에서 Cold와 Hot의 의미는 조금 다릅니다.
  • 예를 들어, Hot Swap, Hot Deploy라는 용어가 있습니다.
    • Hot Swap은 컴퓨터 시스템의 전원이 켜져 있는 상태에서 디스크 등의 장치를 교체할 경우 시스템 재시작 없이 바로 인식하는 것을 의미합니다.
    • Hot Deploy는 서버 재시작 없이 응용 프로그램의 변경 사항을 적용할 수 있는 기능을 말합니다.
  • 암호 화폐 지갑도 Cold Wallet과 Hot Wallet으로 구분됩니다.
    • Hot Wallet은 인터넷이 연결되어 즉시 사용가능하지만 보안에 취약합니다
    • Cold Wallet은 인터넷과 단절되어 있어 사용성은 떨어지나 보안이 강화됩니다.
  • 공통점을 정리하면 아래와 같습니다.
    • Hot은 처음부터 다시 시작하지 않고 같은 작업이 반복되지 않습니다.
    • Cold는 처음부터 새로 시작해야 하고, 새로 시작하므로 같은 작업이 반복됩니다.
  • 리액티브 프로그래밍에서 사용되는 Cold와 Hot도 유사한 의미를 가집니다.

Cold Sequence

  • Sequence는 Publisher가 emit하는 데이터의 연속적인 흐름을 정의해 놓은 것으로 코드에서는 Operator 체인 형태로 정의됩니다.
  • Cold는 처음부터 새로 시작하는 것을 말하므로, Cold Sequence는 Sequence가 새로 시작하는 것을 의미합니다.
  • Cold Sequence는 Subscriber가 구독할 때마다 데이터 흐름이 처음부터 다시 시작하는 Sequence입니다. 정리하면, Subscriber가 구독할 때마다 Publisher가 데이터를 emit하는 과정을 처음부터 다시 시작하는 것을 Cold Sequence라고 합니다.
  • 따라서 Cold Sequence는 Sequence 타임라인이 구독할 때 마다 새로 생긴다고 볼 수 있습니다.

아래 처럼 테스트 코드를 작성하여 Cold Sequence를 테스트 해보겠습니다.

  • Subscriber1이 구독하고 2초 뒤에 Subscriber2가 구독합니다.
  • Subscriber1과 Subscriber2가 구독 할 때마다 emit된 데이터를 처음부터 전달 받고 있음을 확인할 수 있습니다.

Hot Sequence

  • Cold Sequence의 경우 구독이 발생할 때마다 Sequence의 타임라인이 처음부터 새로 시작하므로 Subscriber는 구독 시점과 관계없이 데이터를 처음부터 전달받을 수 있습니다.
  • Hot Sequence의 경우 구독이 발생한 시점 이전에 Publisher로부터 emit된 데이터는 Subscriber가 전달받지 못하고 구독 이후 emit된 데이터만 전달받을 수 있습니다.
  • Publisher가 데이터를 emit하는 과정이 한 번만 일어나고, Subscriber가 각각의 구독 시점 이후에 emit된 데이터만 전달받는 데이터의 흐름을 Hot Sequence라고 합니다.
  • 따라서 Hot Sequence는 Sequence 타임라인이 하나만 생긴다고 볼 수 있습니다.

아래 처럼 테스트 코드를 작성하여 Hot Sequence를 테스트 해보겠습니다.

  • delayElements Operator는 데이터의 emit을 일정시간 동안 지연시킵니다. 코드에서는 1초씩 지연되도록 하였습니다.
  • Subscriber1은 모든 데이터를 전달받지만, Subscriber2는 2.5초뒤에 구독하므로 마지막 2개의 데이터만 전달받습니다.
  • share Operator는 Cold Sequence를 Hot Sequence로 동작하게 해주는 Operator입니다.

  • Reactor API 문서를 보면 위와 같이 share Operator에 대해 설명하고 있습니다. 번역하면 "원본 Flux를 멀티캐스트(공유)하는 새 Flux를 반환합니다. 구독자가 하나 이상 있는 한 이 Flux는 구독되고 데이터를 방출합니다. 모든 구독자가 취소되면 소스 Flux가 취소됩니다." 와 같습니다.
  • 원본 Flux를 공유하므로 한 Subscriber가 구독하는 순간 데이터 emit이 시작되고, 그 이후 구독한 Subscriber는 이미 emit된 데이터는 전달받을 수 없습니다.

HTTP 요청과 응답에서 Cold Sequence와 Hot Sequence

HTTP 요청/응답에서 Cold Sequence와 Hot Sequence를 비교해보겠습니다. 먼저 WebClient를 사용하여 World Time API HTTP 요청을 수행하고 응답으로 Mono를 리턴하도록 메서드를 아래와 같이 구현합니다.

아래와 같이 Cold Sequence 테스트 코드를 작성합니다.

  • 기본적으로 Mono를 구독하면 Cold Sequence로 동작합니다. 따라서 구독이 발생할 때 마다 데이터가 emit됩니다.
  • 첫 번째 구독이 발생하고 2초 뒤에 두 번째 구독이 발생합니다.
  • 구독이 발생할 떄 마다 데이터의 emit 과정이 처음부터 시작되므로 두 번의 새로운 HTTP 요청이 발생합니다. 따라서 두 결과 시간이 2초 정도 차이가 납니다.

아래와 같이 Hot Sequence 테스트 코드를 작성합니다.

  • Mono의 cache Operator를 사용하면 Cold Sequence가 Hot Sequence로 동작합니다.
  • cache Operator는 emit된 데이터를 캐시한 뒤, 구독이 발생할 때 마다 캐시된 데이터를 리턴합니다.
  • 캐시된 데이터를 전달하기 때문에 구독이 발생할 때 마다 Subscriber는 동일한 데이터를 전달받습니다. 따라서 HTTP 요청은 한 번만 발생하므로 두 결과 시간이 동일합니다.

  • Reactor API 문서를 보면 위와 같이 cache Operator에 대해 설명하고 있습니다.
  • 첫 번째 구독이 발생 할 때 데이터가 emit되고 캐시됩니다.

Reactor에서 Hot의 두 가지 의미

  • Reactor에서 Hot에는 사실 두 가지 의미가 있다고 볼 수 있습니다. Warm up과 Hot입니다.
  • Warm up: 최초 구독이 발생하기 전까지는 데이터의 emit이 발생하지 않는 것을 말합니다.
  • Hot: 구독 여부와 상관 없이 데이터가 emit되는 것을 말합니다.
post-custom-banner

0개의 댓글