리액티브 라이브러리를 어떻게 구현할지 정의해 놓은 별도의 표준 사양이 있는데, 이것을 리액티브 스트림즈라고 부른다.
한마디로, 데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양이라고 표현할 수 있다.
# 리액티브 스트림즈의 컴포넌트인 Publisher와 Subscriber 간에 데이터가 전달되는 동작 과정
그림상으로는 Publisher와 Subscriber가 마치 같은 스레드에서 동기적으로 상호작용하는 것처럼 보이지만 실제로 Publisher와 Subscriber는 각각 다른 스레드에서 비동기적으로 상호작용하는 경우가 대부분이다.
Publisher의 속도가 빠르다면 Subscriber에서 데이터를 처리하는 속도가 느려지게 되고 이는 과부하가 생길 수 있다. 그렇기 때문에 이를 조절하기 위해 Subscription.,request를 통해 데이터 개수를 제어한다.
# Kafka의 Pub/Sub와 Reactive의 Pub/Sub의 차이점
Kafka는 Pub와 Sub 사이에 메시지 브로커가 존재한다.
토픽을 기준으로 서로 응답하기 때문에 Sub는 Publisher를 모르더라도 토픽만 알면 응답을 주고 받을 수 있다.
이와 반대로 Reactive에서는 Publisher가 Subscriber를 등록하는 형태로 구독이 이루어진다.
# Subscriber
public interface Subscriber<T> {
public void onSubscribe(Subscription s) ;
public void onNext(T t) ;
public void onError(Throwable t) ;
public void onComplete() ;
}
onSubscribe : 구독 시작 시점에 어떤 처리를 할 것인지 처리하는 역할을 한다.
onNext : Pub가 통지한 데이터를 처리하는 역할을 한다.
onError: 데이터 처리과정에서 에러 발생 시, 해당 에러를 처리하는 역할을 수행한다.
onComplete: 데이터 통지가 정상적으로 완료될 경우에 후처리를 수행한다.
# Subscription
public interface Subscription {
public void request(long n) ;
public void cacel() ;
}
Subscription 인터페이스는 Sub가 구독한 데이터의 개수를 요청하거나 데이터 요청의 취소(구독 해지) 역할을 수행한다.
# 리액티브 스트림즈 관련 용어
Signal : Pub/Sub간에 주고받는 상호작용을 Signal 라고한다. (onSubscribe, onNext, onComplete, onError, request, cancel 등이 있다.)
Demand: Sub가 Pub에게 요청하는 데이터를 의미한다.
Emit: 데이터를 내보내다라는 의미로 이해하면 된다.
Sequence: Flux를 통해 데이터를 생성, emit하고 Filter 메서드를 통해서 필터링한 후, map 메서드를 통해서 변환하는 과정 자체를 Sequence라고 한다.
Operator: just, filter, map 같은 메서드들을 Operator라고 한다.