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에게 전달되지 않는 경우 유실됩니다.