티스토리 뷰
Reactive-Streams는 무엇인가 ?
Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure.
→ Reactive Streams란 Non-blocking Back pressure를 이용한 비동기 데이터 처리 표준입니다.
→ 여기서 중요한 점은 Back pressure와 표준이라는 점입니다.
Reactive-Streams 배경
Netflix, Pivotal, Lightbend의 개발자들이 개발하기 시작, Netflix는 RxJava, Pivotal은 Project Reactor, LIghtbend는 Akka 를 개발하였습니다. 세 회사 모두 Stream API가 꼭 필요하였고, 이러한 각 Stream 들이 유기적으로 연결되기위해서는 공통적인 표준이 필요했으며, 그렇게 탄생하게 되었습니다.
2015년 4월 JVM에서 사용하기 위하여 표준 1.0.0 스펙을 릴리즈 하였고, 2017년 9월 Flow API라는 이름으로 java.util.concurrent 패키지 아래 포함시켜 릴리즈 되었습니다.
Reactive-Streams Standard API
API Components
1. Publisher
데이터를 만들어 통지하는 발행자입니다.
2. Subscriber
데이터를 요청하여 받아 처리하는 구독자입니다.
3. Subscription
Publisher와 Subscriber 간의 통신의 매개체입니다.
API Specification
public interface Publisher<T> {
public void subscribe(Subscriber<? super T> s);
}
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
public interface Subscription {
public void request(long n);
public void cancel();
}
Component | Description |
Publisher | Subscriber의 구독을 받기 위한 subscribe API 하나만을 가지고 있습니다. |
Subscriber | 전달 받은 데이터를 처리하기 위한 onNext, 에러를 처리하는 onError, 작업 완료시 사용하는 onComplete, 매개변수로 Subscription을 받는 API가 있습니다. |
Subscription | n개의 데이터를 요청하기 위한 request, 구독을 취소하기 위한 cancel API가 있습니다. |
Back-Pressure 란?
Back-Pressure을 알아보기 앞서, Push 방식과 Pull 방식에 대해서 알 필요가 있습니다.
Push 방식
Publisher가 Subscriber의 상태를 생각하지 않고, 일방적으로 데이터를 밀어넣는 방식의 처리방법입니다.
여기서 문제점은 Publisher가 Subscriber의 상태를 고려하지 않는다는 점이며, 만약 Publisher가 Subscriber가 처리할 수 없을 정도로 무분별하게 데이터를 전송할 경우, Subscriber는 경우에 따라 해당 데이터를 버리거나, 처리할 수 있을 때까지 보관(Queue)하여 Blocking 하는 전략을 취할 수 있지만, 전체적인 시스템에 문제가 발생하게 됩니다.
Pull 방식
Subscriber가 자신이 처리할 수 있는 데이터만큼을 Publisher에게 요청하는 방식의 처리하는 방법입니다. 이렇게 될 경우 Publisher는 Subscriber가 요청한 만큼의 데이터만 전송하면 되며, Subscriber는 자신이 처리 가능한 범위내에서 동작을 수행하기때문에 Push에서 발생할 수 있는 문제를 해결할 수 있습니다.
이렇게 Subscriber가 자신이 처리할 수 있는 만큼의 데이터를 요청하여 처리하는 방식을 Back-Pressure 또는 Dynamic Pull 방식이라고합니다.
기본적인 Reactive-Sreams의 흐름
Subscriber가 subscribe 함수를 이용하여, Publisher에게 구독을 요청합니다.
Publisher는 onSubscribe 함수를 사용해 Subscriber에게 Subscription을 전달합니다.
Subscription은 Subscriber와 Publisher 간의 통신의 매개체의 역할을 합니다.
→ Subscriber은 Publisher에게 직접적으로 데이터를 요청하지 않고, Subscription의 request API를 통하여 Publisher에게 요청합니다
→ Publisher 또한 Subscription을 통해 Subscriber의 onNext API를 통하여 데이터를 전달하고, 작업이 완료될 경우 onComplete, 에러가 발생하면 onError API를 통하여 통신합니다
→ Subscriber와 Publisher이 Subscription을 통하여 서로 유기적으로 연결되어 데이터를 주고 받으며 통신을 합니다.
위와 같은 처리 흐름(방식)을 앞서 살펴본 Back-Pressure라고 합니다.
Reference
'프레임워크 > Spring' 카테고리의 다른 글
[Spring]Bean 생명주기 콜백 (0) | 2022.03.19 |
---|
- Total
- Today
- Yesterday
- 카카오
- 우선순위큐
- 탐욕법
- dp
- kotlin
- JPA
- Uber
- 비트연산
- 코딩인터뷰
- 스트림
- set
- 해쉬
- 연결리스트
- 코드 스니펫
- 정렬
- BFS
- 프로그래머스
- dfs
- dsu
- 오늘의집
- Java
- 구현
- 스택
- 문자열
- sql
- k8s
- TDD
- 쓰레드
- 알고리즘
- 회고
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |