반응형
안녕하세요
코딩하는헬린이 입니다.
오늘은 Spring webflux에 대한 포스팅이 아니라 Reactive Streams 에 대하여 포스팅할려고 합니다.
갑자기 왜 webflux 도 아닌 reactive streams 인가 ? webflux는 non-blocking과 reactive streams 을 지원합니다. 고로 webflux 기반인 reactive streams 을 알아야한다. 라는 생각이 들어서 포스팅합니다.
Reactive Streams 이란 ?
Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols.
뭐 백프레셔와 non-blocking 를 이용한 비동기 스트림 처리를 위한 표준 ?? 이라고 파파고에서 알려줬습니다.
또 리액티브 스트림은 관찰자(Observer) 패턴, 반복자(Iterator) 패턴, 함수형 패러다임의 조합이라고 합니다.
back pressure 란 ?
- 빠른 Publisher - 느린 Subscriber 문제를 해결하는 원리이다.
- Publisher의 일방적 데이터 Push 가 아니라, Subscriber가 처리할 수 있을 만큼의 데이터만 Subscriber의 요청에 의해서 전달해주는 것이며 dynamic pull 이라 칭한다.
Reactive Streams 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();
}
- Publisher에는 Subscriber의 구독을 받기 위한 subscribe API 하나만 있습니다.
- Subscriber에는 받은 데이터를 처리하기 위한 onNext, 에러를 처리하는 onError, 작업 완료 시 사용하는 onComplete, 그리고 매개 변수로 Subscription을 받는 onSubscribe API가 있습니다.
- Subscription은 n개의 데이터를 요청하기 위한 request와 구독을 취소하기 위한 cancel API가 있습니다
- Subscriber가 subscribe 함수를 사용해 Publisher에게 구독을 요청합니다.
- Publisher는 onSubscribe 함수를 사용해 Subscriber에게 Subscription을 전달합니다.
- 이제 Subscription은 Subscriber와 Publisher 간 통신의 매개체가 됩니다. Subscriber는 Publisher에게 직접 데이터 요청을 하지 않습니다. Subscription의 request 함수를 통해 Publisher에게 전달합니다.
- Publisher는 Subscription을 통해 Subscriber의 onNext에 데이터를 전달하고, 작업이 완료되면 onComplete, 에러가 발생하면 onError 시그널을 전달합니다.
- Subscriber와 Publisher, Subscription이 서로 유기적으로 연결되어 통신을 주고받으면서 subscribe부터 onComplete까지 연결되고, 이를 통해 백 프레셔가 완성됩니다
ref
https://engineering.linecorp.com/ko/blog/reactive-streams-with-armeria-1/
https://sjh836.tistory.com/182
반응형