-
[Webflux] Reactor Hot And Cold PublisherSpring 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에게 전달되지 않는 경우 유실됩니다.
'Spring' 카테고리의 다른 글
Spring Entity, DTO, VO (0) 2023.03.16 Spring Interceptor, Filter, AOP 와 각 차이점 (0) 2023.03.16 Spring IoC와 DI에 관하여 (0) 2023.02.20 Spring Boot 구글 OAuth2 로그인 구현 방법(spring-securify-oauth2) (0) 2023.02.16 Spring에서 Service class를 만들때 반드시 Interface를 구현해야할까 (0) 2020.02.28