[Reactive] 07. Cold Sequence와 Hot Sequence

Jimin Lim·2024년 3월 15일
0

Spring

목록 보기
14/18
post-thumbnail
post-custom-banner

7.1 Cold와 Hot의 의미

  • Hot: 무언가 처음부터 다시 시작하지 않는 것
  • Cold: 서버나 시스템을 부팅할 때 초기화 작업을 하는 것

예를 들어 HotDeploy 는 서버를 재시작하지 않고 응용 프로그램의 변경 사항을 적용할 수 있는 기능

간단 요약하자면 Cold는 무언가를 새로 시작하고, Hot은 무언가를 새로 시작하지 않는 것

7.2 Cold Sequence

  • Cold Sequence: Subscriber의 구독 시점이 달라도 구독을 할 때마다 Publisher가 데이터를 emit하는 과정을 처음부터 다시 시작

7.3 Hot Sequence

  • Hot Sequecne: 구독이 발생한 시점 이전에 Publisher로부터 emit된 데이터는 Subscriber가 전달받지 못하고, 구독이 발생한 시점 이후에 emit된 데이터만 전달받을 수 있음
public class Example7_2 {
    public static void main(String[] args) throws InterruptedException {
        String[] singers = {"Singer A", "Singer B", "Singer C", "Singer D", "Singer E"};

        log.info("# Begin concert:");
        Flux<String> concertFlux =
                Flux
                    .fromArray(singers) //원본 flux
                    .delayElements(Duration.ofSeconds(1))
                    .share(); 
                    
        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)
        );

        Thread.sleep(3000);
    }
}
  • operator share: 원본 flux를 여러 subscriber가 공유

7.4 HTTP 요청과 응답에서 Cold Sequence와 Hot Sequence

Hot Sequence 예시

public class Example7_4 {
    public static void main(String[] args) throws InterruptedException {
        URI worldTimeUri = UriComponentsBuilder.newInstance().scheme("http")
                .host("worldtimeapi.org")
                .port(80)
                .path("/api/timezone/Asia/Seoul")
                .build()
                .encode()
                .toUri();

        Mono<String> mono = getWorldTime(worldTimeUri).cache(); //cache 이용 
        mono.subscribe(dateTime -> log.info("# dateTime 1: {}", dateTime));
        Thread.sleep(2000);
        mono.subscribe(dateTime -> log.info("# dateTime 2: {}", dateTime));

        Thread.sleep(2000);
    }

    private static Mono<String> getWorldTime(URI worldTimeUri) {
        return WebClient.create()
                .get()
                .uri(worldTimeUri)
                .retrieve()
                .bodyToMono(String.class)
                .map(response -> {
                    DocumentContext jsonContext = JsonPath.parse(response);
                    String dateTime = jsonContext.read("$.datetime");
                    return dateTime;
                });
    }
}
  • cache(): operator로 cold sequence 를 hot sequence로 동작하게 해줌, 결과적으로 캐시된 데이터 전달하게 된다.

대표적인 예로는 REST API 인증을 위해 인증 토큰을 발급하는 경우가 있다. cache 를 이용해 매번 새로운 토큰을 발급받지 않고 캐시된 인증 토큰을 사용하면 효율적인 동작 과정을 구성할 수 있다.

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️
post-custom-banner

0개의 댓글