본문 바로가기
ㄴ Spring Webflux/스프링으로 시작하는 리액티브 프로그래밍

Ch07 Cold Sequence 와 Hot Sequence

by 경아ㅏ 2024. 10. 2.

 
7.1 Cold 와 Hot 의 의미

Hot: 작업을 새로 시작하지 않고 기존 상태를 유지한다는 의미 (e.g Hot Swap, Hot Deploy)
Cold:  기존의 연결을 끊고 같은 작업을 반복한다는 의미 (e.g Cold Wallet)


7.2 Cold Sequence

구독을 할 때마다 Publisher 가 데이터를 emit 하는 과정을 처음부터 다시 시작하는 데이터 흐름
(A가 구독하면 처음부터 emit, 추후에 B가 구독하면 다시 처음부터 emit)

Flux<String> coldFlux = Flux
                            .fromIterable(Arrays.asList("A", "B", "C"))
                            .map(String::toLowerCase);
                            
coldFlux.subscribe(each -> log.info("# Subscriber1: {}", each);
Thread.sleep(2000L);
coldFlux.subscribe(each -> log.info("# Subscriber2: {}", each);

// 로그 결과
// # Subscriber1: A
// # Subscriber1: B
// # Subscriber1: C
// # Subscriber2: A
// # Subscriber2: B
// # Subscriber2: C

// subscribe 할 때마다 데이터를 처음부터 emit




7.3 Hot Sequence

구독을 시작한 시점 이전에 emit 된 데이터는 전달받지 않고 이후 데이터만 전달 받는 데이터 흐름
다른 시점에 구독이 여러번 이루어지더라도 타임라인은 하나만 유지되어 전체 데이터는 한번만 emit 되는 게 포인트다
 

Flux<String> hotFlux = Flux
                           .fromIterable(Arrays.asList("A", "B", "C", "D"))
                           .delayElements(Duration.ofSeconds(1))
                           .share();
                           
hotFlux.subscribe(each -> log.info("# Subscriber1: {}", each);
Thread.sleep(2500);
hotFlux.subscribe(each -> log.info("# Subscriber2: {}", each);


// 로그 결과
// # Subscriber1 A
// # Subscriber1 B
// # Subscriber1 C
// # Subscriber2 C
// # Subscriber1 D
// # Subscriber2 D

// Subscriber1, Subscriber2 는 모두 원본 Flux 를 공유
// Subscriber 2 는 2초가 지난 시점 부터 emit 되는 데이터만 받을 수 있음




7.4 HTTP 요청과 응답에서 Cold Sequence 와 Hot Sequence 의 동작 흐름

1) Cold Sequence WeClient 요청을 subscribe 하는 경우

Cold Sequence 에서는 구독을 하는 시점에 데이터 emit을 시작하고 두 번 구독시 HTTP 요청도 두 번 이루어짐
 

Mono<String> mono = { WebClient로 Http 요청하는 Publisher 를 리턴하는 코드 }

mono.subscribe(dateTime -> log.info("# dateTime1: {}", dateTime));
Thread.sleep(2000);
mono.subscribe(dateTime -> log.info("# dateTime2: {}", dateTime));

// 로그 결과 (2초 차이)
// # dateTime1: 2024-10-02T21:55:06 ...
// # dateTime2: 2024-10-02T21:55:08 ...

 
 
2) Hot Sequence WebClient 요청을 subscribe 하는 경우

(cache()는 Cold Sequence 로 동작하는 Mono 를 Hot sequence 로 변경하는 메서드)
HTTP 요청은 한번만 이루어지고 요청 결과로 만든 데이터가 emit + 캐싱되어 구독할 때마다 캐싱된 데이터를 로깅
 

Mono<String> mono = { WebClient로 Http 요청하는 Publisher 를 리턴하는 코드 }.cache();

mono.subscribe(dateTime -> log.info("# dateTime1: {}", dateTime));
Thread.sleep(2000);
mono.subscribe(dateTime -> log.info("# dateTime2: {}", dateTime));

// 로그 결과 (Cache 된 동일한 데이터)
// # dateTime1: 2024-10-02T21:55:06 ...
// # dateTime2: 2024-10-02T21:55:06 ...

 

3) Hot Seqence 구분
 
데이터가 emit 되는 시점에 따라 두가지로 구분
ⓐ 첫번째 Subscriber 가 구독을 시작할 때 emit (Warm up)
ⓑ 구독 여부와 상관 없이 바로 emit

위의 예시에서 share() 가 ⓐ, cache() 가 ⓑ
 
 

댓글