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() 가 ⓑ
'ㄴ Spring Webflux > 스프링으로 시작하는 리액티브 프로그래밍' 카테고리의 다른 글
Ch09 Sinks (0) | 2024.11.03 |
---|---|
Ch08 Backpressure (0) | 2024.10.22 |
Ch06 마블 다이어그램 (0) | 2024.09.19 |
Ch05 Reactor 개요 (0) | 2024.09.18 |
Ch04 리액티브 프로그래밍을 위한 사전 지식 (0) | 2024.09.17 |
댓글