Reactive Streams is a standard for asynchronous data processing in a streaming fashion with non-blockingback pressure.
streaming
asynchronous + non-blocking
back-pressure
Publisher에서 발행하고, Subscriber에서 구독할 때
Publisher에서 데이터를 Subscriber로 Push하는 방식이 아니라
Subscriber가 Publisher로 처리할 수 있는 양의 크기만큼 Pull함으로써
Subscriber의 장애를 방지
API 코드
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();
}
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
구현체들 간의 상호운용성(Interoperability)
Spring WebFlux도 Reactive Streams를 구현
Reactive Programming이란?
Thread-per-request Model
문제점
Block 시 대기 시간으로 인한 낭비
유휴 Thread 부족 (Thread Starving) → Connection Refuse Error
Thread를 너무 늘리면 Context Switch로 인한 Overhead 발생
CPU Utilization 저하
심한 병목 혹은 서버 다운으로 이어짐
해결 방법 : Reactive Programming
Single Thread + Event Loop + Asychronocity + Non-blocking
ex) Node.js
Reactive Programming
장점
Non-Blocking
요청 시 Event Queue에 등록하고 즉시 다음 작업 진행
Asynchronicity
처리 완료 시 Callback을 통해 즉시 응답
Few Threads로 처리 가능
Thread Starving 또는 Context Switch로 인한 Overhead 발생 X
CPU Utilization 극대화
Thread-per-request Model에 비해 같은 자원으로 비교적 많은 일을 처리
JDBC vs R2DBC
Non-blocking을 쓰는 Web Server도 있지만
Non-blocking을 쓰는 DB Server도 있다
연관 챕터
108
내용 요약
Spring WebFlux란?
Reactive Streams란?
Reactive Streams is a standard for asynchronous data processing in a streaming fashion with non-blocking back pressure.
streaming
asynchronous + non-blocking
back-pressure
API 코드
구현체들 간의 상호운용성(Interoperability)
Reactive Programming이란?
Thread-per-request Model
Reactive Programming
JDBC vs R2DBC
참고 및 출처
@caffeine-library/readers-pro-spring-5