Publisher

Single Ko·2024년 8월 13일
0

reactive-programing

목록 보기
7/8

Cold Publisher

리액티브 프로그래밍에서 데이터 스트림을 처리하는 방식은 애플리케이션의 성능과 효율성에 큰 영향을 미칩니다. 리액터(Reactor)와 같은 리액티브 라이브러리는 퍼블리셔(Publisher)와 서브스크라이버(Subscriber)의 개념을 통해 데이터 흐름을 관리하며, 이 중 콜드 퍼블리셔는 온디맨드 방식의 데이터 생성 및 전달을 가능하게 하는 중요한 역할을 합니다.

콜드 퍼블리셔란 무엇인가?

콜드 퍼블리셔는 구독자가 구독하기 전까지는 데이터를 생성하지 않는 데이터 소스입니다. 마치 주문을 받고 나서야 요리를 시작하는 셰프와 같다고 생각할 수 있습니다. 각 구독자는 퍼블리셔에 구독할 때마다 독립적인 데이터 스트림을 받게 되며, 이는 다른 구독자의 데이터 스트림에 영향을 받지 않습니다. 넷플릭스를 예로 들면, 각 사용자는 동일한 영화를 시청하더라도 서로 독립적인 스트림을 통해 시청하며, 한 사용자가 영화를 일시 정지하거나 되감더라도 다른 사용자의 시청 경험에는 영향을 미치지 않습니다.

콜드 퍼블리셔의 특징

  • 온디맨드 데이터 생성: 구독자가 구독하기 전까지는 데이터가 생성되지 않으므로 리소스를 효율적으로 사용할 수 있습니다.
  • 독립적인 데이터 스트림: 각 구독자는 자신만의 데이터 스트림을 가지므로, 다른 구독자의 행동에 영향을 받지 않습니다.
  • 재사용 가능성: 동일한 퍼블리셔에 여러 구독자가 구독하더라도 각 구독자는 처음부터 데이터를 받게 됩니다.

코드로 알아보는 cold publisher

Java의 Reactor 라이브러리에 Flux.create 메서드는 콜드 퍼블리셔를 생성하는 대표적인 방법 중 하나입니다. 이 메서드를 사용하면 퍼블리셔의 동작을 직접 정의할 수 있으며, 각 구독자에게 독립적인 데이터 스트림을 제공할 수 있습니다.

예시 코드 분석:

var flux = Flux.create(fluxSink -> {
    log.info("invoked");
    for (int i = 0; i < 3; i++) {
        fluxSink.next(i);
    }
    fluxSink.complete();
});

flux.subscribe(Util.subscriber("sub1"));
flux.subscribe(Util.subscriber("sub2"));

위 코드에서 Flux.create는 콜드 퍼블리셔를 생성합니다. 각 구독자가 구독할 때마다 FluxSink가 새로 생성되며, 이로 인해 두 구독자(sub1, sub2)는 동일한 데이터(1, 2, 3)를 독립적으로 받게 됩니다. 따라서 각 구독자는 독립적인 데이터 스트림을 통해 데이터를 받게 된다는 점을 알수 있습니다.

결론:

콜드 퍼블리셔는 리액티브 프로그래밍에서 온디맨드 데이터 처리를 위한 강력한 도구입니다. 각 구독자에게 독립적인 데이터 스트림을 제공함으로써 리소스를 효율적으로 사용하고 유연한 데이터 처리를 가능하게 합니다. Flux.create와 같은 메서드를 사용하여 콜드 퍼블리셔를 생성하고, 이를 통해 리액티브 애플리케이션의 성능과 효율성을 향상시킬 수 있습니다.

Hot Publisher

핫 퍼블리셔는 구독자의 존재 여부와 관계없이 데이터를 생성하고 방출하는 데이터 소스입니다. 라디오 방송국을 생각해 보면, 방송국은 청취자가 있든 없든 계속해서 방송을 송출합니다. 핫 퍼블리셔에 새로운 구독자가 추가되면, 해당 구독자는 현재 방출되고 있는 데이터부터 수신하게 됩니다. 따라서 핫 퍼블리셔는 실시간 데이터 스트림을 처리하는 데 적합합니다.

핫 퍼블리셔의 특징

  • 지속적인 데이터 방출: 구독자 유무와 상관없이 데이터를 생성하고 방출합니다.
  • 공유 데이터 스트림: 모든 구독자는 동일한 데이터 스트림을 공유합니다.
  • 실시간 데이터 처리: 구독자는 최신 데이터를 즉시 수신할 수 있습니다.

코드로 알아보는 cold publisher

publish().autoConnect(0) 메서드는 콜드 퍼블리셔를 핫 퍼블리셔로 변환 시킬수 있습니다. 이 메서드를 사용하면 구독자 수와 관계없이 데이터 스트림을 시작하고 유지할 수 있습니다.

예시 코드 분석:

var movieFlux = movieStream().publish().autoConnect(0);

Util.sleepSeconds(2);
movieFlux
        .take(4)
        .subscribe(Util.subscriber("sam"));

Util.sleepSeconds(3);
movieFlux
        .take(3)
        .subscribe(Util.subscriber("mike"));

Util.sleepSeconds(15);

private static Flux<String> movieStream() {
    return Flux.generate(
            () -> {
                log.info("received the request");
                return 1;
            },
            (state, sink) -> {
                var scene = "movie scene " + state;
                log.info("playing {}", scene);
                sink.next(scene);
                return ++state;
            }
    )
    .take(10)
    .delayElements(Duration.ofSeconds(1))
    .cast(String.class);
}

위 코드에서 movieStream().publish().autoConnect(0)는 핫 퍼블리셔를 생성합니다. sam이 2초 후 구독하고, mike는 5초 후 구독합니다. sam은 처음부터 4개의 영화 장면을 보고, mikesam이 이미 본 장면부터 이어서 3개의 장면을 보게 됩니다.

결론:

핫 퍼블리셔는 실시간 데이터 처리 및 리소스 공유가 중요한 경우에 유용합니다. publish().autoConnect(0)와 같은 메서드를 사용하여 콜드 퍼블리셔를 핫 퍼블리셔로 변환하고, 실시간 데이터 스트림을 효율적으로 처리할 수 있습니다.

콜드 퍼블리셔 vs 핫 퍼블리셔: 선택 기준

어떤 유형의 퍼블리셔를 선택할지는 애플리케이션의 요구 사항에 따라 달라집니다.

  • 온디맨드 데이터 생성 및 독립적인 데이터 스트림이 필요한 경우: 콜드 퍼블리셔를 선택합니다. (예: 파일 읽기, 데이터베이스 쿼리)
  • 실시간 데이터 처리 및 리소스 공유가 중요한 경우: 핫 퍼블리셔를 선택합니다. (예: 주식 시세, 채팅, 센서 데이터)

마무리

콜드 퍼블리셔와 핫 퍼블리셔는 리액티브 프로그래밍에서 데이터 스트림을 처리하는 두 가지 중요한 방식입니다. 각 유형의 특징과 차이점을 이해하고 적절하게 활용함으로써 효율적이고 강력한 리액티브 애플리케이션을 구축할 수 있습니다. 😊

profile
공부 정리 블로그

0개의 댓글