Cold와 Hot의 의미

https://reactivex.io/ “Hot” and “Cold” Observables에 대해 아래와 같이 설명되어 있다.

언제 Observable이 항목 시퀀스를 방출하기 시작합니까? Observable에 따라 다릅니다. “Hot” Observable은 생성되자마자 항목을 방출하기 시작할 수 있으므로 나중에 해당 Observable에 구독하는 모든 관찰자는 시퀀스의 중간 어딘가에서 관찰을 시작할 수 있습니다. 반면에 “Cold” Observable은 관찰자가 구독하기 전까지 항목을 방출하기를 기다리므로 이러한 관찰자는 시작부터 전체 시퀀스를 볼 수 있다는 것이 보장됩니다.

즉, Hot은 생성됨가 동시에 데이터를 방출하고, 나중에 구독한 구독자는 구독시점부터의 데이터를 받게된다. Cold는 publisher가 발행한 데이터를 구독 시점에 처음부터 데이터를 받게된다.

Cold Sequence

Flux<String> coldFlux =
	Flux
		.fromIterable(Arrays.asList("KOREA", "JAPAN", "CHINESE"))
		.map(String::toLowerCase);

coldFlux.subscribe(country -> log.info("# Subscriber1: {}", country));
log.info("==============================");

Thread.sleep(2000L);

coldFlux.subscribe(country -> log.info("# Subscriber2: {}", country));

실행결과

# Subscriber1: korea
# Subscriber1: japapn
# Subscriber1: chinese
==============================
# Subscriber2: korea
# Subscriber2: japapn
# Subscriber2: chinese

실행 결과를 보면 알 수 있듯이, 언제 구독을 해도 Upstream에서 반환된 Flux는 subscirber가 모든 데이터를 받을 수 있다.

Hot Sequence

String[] singers = {
	"Singer A",
	"Singer B",
	"Singer C",
	"Singer D",
	"Singer E"
};

log.info("# Begin concert:");

Flux<String> concertFlux =
	Flux
		.fromArray(singers)
		.delayElements(Duration.ofSeconds(1)) // 1초에 1개씩 데이터 발행
		.share(); // Cold Sequnece를 Hot Sequnece로 동작하게 해주는 Operator다.

concertFlux.subscribe(
	singer -> log.info("# Subscriber1 is watching {}'s song",
								singer));

Thread.sleep(2500);

concertFlux.subscribe(
	singer -> log.info("# Subscriber2 is watching {}'s song",
								singer));

09:11:16.375 [main] INFO - # Beigin concert:
09:11:17.375 [parallel-1] INFO - # Subscriber1 is watching Singer A's song
09:11:18.375 [parallel-2] INFO - # Subscriber1 is watching Singer B's song
09:11:19.375 [parallel-3] INFO - # Subscriber1 is watching Singer C's song
09:11:19.375 [parallel-3] INFO - # Subscriber2 is watching Singer C's song
09:11:20.375 [parallel-4] INFO - # Subscriber1 is watching Singer D's song
09:11:20.375 [parallel-4] INFO - # Subscriber1 is watching Singer D's song
09:11:21.375 [parallel-1] INFO - # Subscriber1 is watching Singer E's song
09:11:21.375 [parallel-1] INFO - # Subscriber1 is watching Singer E's song

반환 결과를 보면 구독 시점에 발행되는 데이터를 받을 수 있다.