반응형

리액티브 프로그래밍에서 Cold Sequence와 Hot 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
반응형
'IT기술 > webflux (reactor)' 카테고리의 다른 글
| [WebFlux] 리액티브 스트림즈 Sinks: 핵심 개념과 활용 가이드 (0) | 2025.04.28 |
|---|---|
| [WebFlux] Backpressure란? – 리액티브 데이터 흐름 제어의 핵심 (6) | 2025.04.27 |
| [WebFlux] 마블 다이어그램(Marble Diagram): 리액티브 프로그래밍의 시각적 도구 (2) | 2025.04.12 |
| Reactor: Spring WebFlux의 리액티브 스트림즈 구현체 (4) | 2025.04.01 |
| Spring WebFlux와 리액티브 프로그래밍의 기초: 함수형 인터페이스부터 함수 디스크립터까지 (2) | 2025.03.26 |