Cold Sequence

구독 할 때마다 타임라인이 새로 생성됨

구독하는 시점과 상관없이 첫번째로 emit 된 데이터부터 읽을 수 있음

ex) Flux.fromIterable(Array.asList("A", "B", "C")

subscribe(data -> Logger.info("data : {}", data) // ABC

subscribe(data -> Logger.info("data : {}", data) // ABC

 

 

Hot Sequence

타임라인이 하나만 존재

구독하는 시점에 따라 구독 시점 이후로 emit 된 데이터만 읽을 수 있음

ex) Flux.fromStream(Stream.of("A", "B", "C").delayElements(Duration.ofSeconds(1)).share()

subscribe(data -> Logger.info("data : {}", data) // A B

TimeUtils.sleep(2000)

subscribe(data -> Logger.info("data : {}", data) // C

* share() : cold 시퀀스를 hot 시퀀스로 변환해줌

반응형

'back > Reactive Java' 카테고리의 다른 글

Reactive 란?  (1) 2023.10.16

Reactive System 설계 원칙

아래 네가지 원칙을 잘 반영한 시스템

 

Responsive : 응답성 즉각적인 응답

Resilient : 회복성 장애시 회복성

Elastic : 탄력성 작업량 변화에도 응답성을 유지하는 것

Message Driven : 비동기(async) 메시지 주고받아 느슨한 결합(loose coupling), 위치 투명성(location transparency) 보장

 

 

Reactive programming 특징

1) 데이터 소스에 변경이 있을때마다 데이터를 전파 - publisher 데이터 전파, subscriber 전파된 데이터를 받아서 처리

2) 선언형 프로그래밍 패러다임 : 실행할 동작을 구체적으로 명시하지 않고 목표만 정의 

3) 함수형 프로그래밍 기법 사용

 

 

명령형 프로그래밍 vs 선언형 프로그래밍

명령형 프로그래밍

List<Integer> numbers = Arrays.asList(1,3,21,10,8);
int sum = 0;

for (int number: numbers) {
 if (number > 6 && (number % 2 != 0)) {
   sum += number;
 }
}

선언형 프로그래밍

List<Integer> numbers = Arrays.asList(1,3,21,10,8);

int sum = numbers.stream()
	.filter(number -> number > 6 && number%2!=0)
	.mapToInt(number -> number)
	.sum();

 

Reactive Streams 란?

리액티브 프로그래밍을 표준화 한 명세

https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#specification

 

reactive streams 4가지 인터페이스

1) Publisher : 데이터 통제

2) Subscriber : 퍼블리셔가 통제한 데이터를 구독하는 구독자

3) Subscription : 구독 자체를 정의

4) Process : Publisher & Subsriber 역할을 동시에 할 수 있는 인터페이스

 

 

Reactive Streams 구현체

1) RxJava

2) Java 9 Flow API

3) Akka Streams

4) Reactor

5) RxJS, RxScala, RxAndroid 등..

 

 

참고 :

reactivemanifesto.org

반응형

'back > Reactive Java' 카테고리의 다른 글

cold vs hot sequence  (1) 2023.11.06

+ Recent posts