Spring

[Webflux] Reactor Hot And Cold Publisher

randev 2023. 2. 22. 20:32

Hot and Cold Publishers는 데이터 스트림을 생성하는 Publisher의 두 가지 유형입니다.

Cold Publishers

  • Subscription이 이루어지기 전까지 데이터를 생성하지 않는 Publisher를 Cold Publisher라고 합니다.
  • 이것은 HTTP 요청과 유사하게 생각해볼 수 있습니다. 호출을 하지 않으면 결과도 없습니다.
  • 각 Subscription은 해당 Publisher의 데이터를 처음부터 시작합니다.
  • Cold Publisher는 데이터를 생성하고 Subscriber가 Subscription을 요청할 때 데이터를 제공합니다.
Flux<String> source = Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple"))
                          .map(String::toUpperCase);

source.subscribe(d -> System.out.println("Subscriber 1: "+d));
source.subscribe(d -> System.out.println("Subscriber 2: "+d));
Subscriber 1: BLUE
Subscriber 1: GREEN
Subscriber 1: ORANGE
Subscriber 1: PURPLE
Subscriber 2: BLUE
Subscriber 2: GREEN
Subscriber 2: ORANGE
Subscriber 2: PURPLE

Hot Publishers

  • Subscription의 타이밍과 상관없이 데이터를 생성하는 Publisher를 Hot Publisher라고 합니다.
  • Subscriber는 Hot Publisher가 생성한 데이터의 일부 또는 전체를 수신할 수 있습니다.
  • Hot Publisher는 데이터 생성 및 전달에 대한 제어권을 가지며, 여러 Subscriber가 같은 데이터를 수신할 수 있습니다.
  • 대표적인 연산자로는 just() 가 있습니다.
  • just 를 Cold Publisher로 변환하려면 defer() 를 사용할 수 있습니다.
Sinks.Many<String> hotSource = Sinks.unsafe().many().multicast().directBestEffort();

Flux<String> hotFlux = hotSource.asFlux().map(String::toUpperCase);

hotFlux.subscribe(d -> System.out.println("Subscriber 1 to Hot Source: "+d));

hotSource.emitNext("blue", FAIL_FAST); 
hotSource.tryEmitNext("green").orThrow(); 

hotFlux.subscribe(d -> System.out.println("Subscriber 2 to Hot Source: "+d));

hotSource.emitNext("orange", FAIL_FAST);
hotSource.emitNext("purple", FAIL_FAST);
hotSource.emitComplete(FAIL_FAST);
Subscriber 1 to Hot Source: BLUE
Subscriber 1 to Hot Source: GREEN
Subscriber 1 to Hot Source: ORANGE
Subscriber 2 to Hot Source: ORANGE
Subscriber 1 to Hot Source: PURPLE
Subscriber 2 to Hot Source: PURPLE

Subscriber 2의 경우는 subscribe() 를 통해 구독하기 이전에 “blue”, “green” 이 먼저 방출되었기 때문에 해당 데이터를 받지 못한것을 확인할 수 있습니다.

또한, Hot Publisher는 다음과 같은 특징을 가집니다.

  • ConnectableFlux를 사용하여 구현할 수 있습니다.
  • 여러 Subscriber에게 데이터를 전달할 수 있습니다.
  • Subscription이 발생하기 전에 데이터가 이미 생성될 수 있습니다.
  • 일부 Subscriber가 생성된 데이터를 놓칠 수 있습니다.
  • Hot Publisher에서 생성된 데이터는 Subscriber에게 전달되지 않는 경우 유실됩니다.