IT기술/webflux (reactor)

WebFlux Cold Sequence와 Hot Sequence: 데이터 흐름의 두 가지 방식

후스파 2025. 4. 21. 09:01
반응형

spring webflux reactor

리액티브 프로그래밍에서 Cold SequenceHot Sequence는 데이터 발행 방식을 결정하는 핵심 개념입니다. 이 두 방식은 구독자(Subscriber)와의 관계와 데이터 처리 타이밍에 근본적인 차이를 가지며, Spring WebFlux 환경에서 효율적인 시스템 설계를 위해 반드시 이해해야 합니다.

 


 

1. Cold Sequence: 매번 새로 시작되는 데이터 흐름

정의

  • Cold Publisher가 생성하는 데이터 흐름
  • 각 구독 발생 시마다 데이터 스트림을 처음부터 재생성
  • 독립적인 데이터 처리 파이프라인 제공

특징

  • 독립적 실행: 구독자마다 별도의 데이터 스트림 생성
  • Flux coldFlux = Flux.just("A", "B", "C") .map(String::toLowerCase); coldFlux.subscribe(v -> System.out.println("Sub1: " + v)); // A, B, C coldFlux.subscribe(v -> System.out.println("Sub2: " + v)); // A, B, C (동일 데이터)
  • 리소스 관리: 구독 시마다 새로운 리소스 할당 (예: 파일 읽기, DB 쿼리)
  • 예측 가능성: 항상 동일한 데이터 제공

사용 사례

  • REST API 요청 처리
  • 데이터베이스 쿼리 결과 스트리밍
  • 정적 파일 읽기 작업

 


 

2. Hot Sequence: 실시간 공유 데이터 흐름

정의

  • Hot Publisher가 생성하는 데이터 흐름
  • 구독 여부와 관계없이 데이터 스트림 진행
  • 구독 시점 이후 데이터만 수신

특징

  • 공유 리소스: 모든 구독자가 동일 데이터 스트림 공유
  • Flux hotFlux = Flux.interval(Duration.ofSeconds(1)) .share(); // Cold → Hot 변환 hotFlux.subscribe(v -> System.out.println("Sub1: " + v)); // 0, 1, 2, 3... Thread.sleep(2500); hotFlux.subscribe(v -> System.out.println("Sub2: " + v)); // 2, 3, 4...
  • 실시간 처리: 이벤트 스트리밍, 센서 데이터 수집에 적합
  • 리소스 효율: 단일 데이터 소스 공유

핵심 연산자

  • share(): Cold → Hot 변환 (구독자 공유)
  • cache(): 지정한 개수만큼 데이터 캐싱
    Flux tokenFlux = getTokenFromAPI().cache(1);  // 토큰 재사용
  • replay(): 과거 데이터 재전송 설정

사용 사례

  • 실시간 주가 정보 스트리밍
  • 채팅 애플리케이션
  • 시스템 모니터링 지표 수집

 


 

3. Cold vs Hot Sequence 비교표

구분 Cold Sequence Hot Sequence
데이터 생성 구독 시마다 새로 생성 구독 전부터 독립적 생성
리소스 사용 구독자 수만큼 리소스 사용 단일 리소스 공유
데이터 공유 구독자별 독립 데이터 모든 구독자가 동일 데이터 공유
적합 분야 개별 요청 처리, 배치 작업 실시간 이벤트 처리, 브로드캐스팅
대표 연산자 fromIterable(), just() share(), cache(), replay()

 


 

4. 실제 적용 예시

인증 토큰 관리 (Hot Sequence 활용)

// 토큰 발급 후 1시간 동안 캐싱
Mono authToken = Mono.fromCallable(this::generateToken)
                             .cache(Duration.ofHours(1));

// 여러 컴포넌트에서 동일 토큰 공유
authToken.subscribe(token -> callSecureAPI(token));
authToken.subscribe(token -> initWebSocket(token));

파일 처리 (Cold Sequence 활용)

Flux logReader = Flux.using(
    () -> Files.lines(Paths.get("system.log")),
    Flux::fromStream,
    Stream::close
);

// 각 요청별 독립적 파일 읽기
logReader.subscribe(line -> analyzeLog(line));  // 전체 파일 처리
logReader.subscribe(line -> countErrors(line)); // 다시 전체 파일 처리

 


 

5. 선택 가이드

  • Cold Sequence 선택 시
    • 개별 요청에 독립적인 데이터 필요
    • 재처리가 필요한 작업 (예: 보고서 생성)
    • 멱등성(idempotent)이 보장되는 작업
  • Hot Sequence 선택 시
    • 실시간 데이터 공유 필요
    • 고비용 리소스 재사용 (DB 연결 등)
    • 이벤트 기반 아키텍처 구성

 


 

결론

Cold와 Hot Sequence는 각각 다른 시나리오에 최적화된 도구입니다.

  • Cold: 데이터 소스의 안정성과 일관성 요구
  • Hot: 실시간성과 리소스 효율성 요구

이해도를 높이기 위해 실제 예제 코드를 작성해보고, Reactor의 Publisher 동작 방식을 관찰하는 것이 가장 효과적인 학습 방법입니다.

 

 

[WebFlux] Cold Sequence와 Hot Sequence

리액티브 프로그래밍에서 Cold Sequence와 Hot Sequence는 Publisher가 데이터를 emit하는 방식에 대...

blog.naver.com

 

 

[WebFlux] 마블 다이어그램(Marble Diagram): 리액티브 프로그래밍의 시각적 도구

마블 다이어그램은 리액티브 프로그래밍에서 데이터 흐름과 연산자(Operator)의 동작을 시각적으로 표현하는 강력한 도구입니다. 특히 Reactor와 같은 리액티브 라이브러리에서 비동기 데이터 흐름

hoosfa.tistory.com

 

반응형