ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webflux] Reactor Hot And Cold Publisher
    Spring 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에게 전달되지 않는 경우 유실됩니다.

     

    댓글

Designed by Tistory.