리액티브 프로그래밍

Red Culture·2021년 7월 17일
0

리액티브 프로그래밍이란

빅데이터, 다양한 애플리케이션 환경, 빠른 응답 시간을 요구하는 사용자들에 대한 사용 패턴이라는 변화되는 환경 속에서 다양한 소스에서 들어오는 데이터 흐름(스트림)을 비동기적으로 합쳐서 문제를 해결해 나가는 프로그래밍 방식을 의미한다.
우아한 형제들 기술블로그에서는 여러 API를 취합해서 전달해야 하는 시스템에서는 각 API 경과시간의 sum 만큼의 시간이 필요하지만, 리액티브 시스템을 이용하면 요청을 비동기로 동시에 보내기 때문에 각 API 경과시간 중 가장 긴 요청 시간만큼만 걸린다고 했다.
리액티브 프로그래밍을 위해 Spring WebFlux에서는 Reactor 라이브러리를 제공했다.

Reactive Streams 인터페이스란

Spring Reactor, RxJava는 Reactive Streams 인터페이스를 구현한 라이브러리이고 가장 많이 사용한다. 논블로킹과 백프레셔를 갖춘 비동기 스트림 처리를 위한 표준이다.

  • 백프레셔: subscriber가 수용할 수 있는 만큼만 publisher에게 데이터를 요청하는 방식 (pull)
  • 옵저버패턴: push 방식으로 publisher가 보내고 싶은 대로 계속 보낸다.

Reactive Streams 기본적인 흐름


1) subscriber가 publisher에게 subcribe하면 publisher가 데이터나 시퀀스를 전달한다.
2) 데이터나 시퀀스를 전달하기 전에 publisher는 subscribe에 정의된 onSubscribe()를 호출하고 subscriber는 몇 개의 데이터를 보낼지 요청하기 위해 subscription을 사용해 request(n)을 호출해 데이터 전송 요청을 한다.
3) publisher는 0~N개 데이터 또는 시퀀스를 subscriber에게 전달한다.
4) 이 과정에서 하나의 데이터를 전달할 때 마다 onNext()를 호출하고, 에러가 발생하면 onError()를 호출하고, 데이터 또는 시퀀스 전달이 완료되면 onComplete()를 호출한다.

*subscriber가 publisher에게 request하는 과정을 백프레셔라고 한다. push 하는 데이터(시퀀스)의 흐름을 제어할 수 있다. (request(1)은 1개만 요청, request(max)는 최대값 요청)
Subscriber의 부하를 유지할 수 없을 경우를 대비해 큐에 임시 저장하여 버퍼링을 할 수도 있다.

Reactive Streams 인터페이스

1) Processor
2) Publisher

  • subscribe

3) Subscriber

  • onSubscribe
    -subscriber가 구독하면 발행자인 publisher가 제일 처음 호출하는 메서드이고 이때 publisher는 onSubscribe()를 호출하면서 subscription을 매개변수로 전달한다.
    -subscriber는 publisher로부터 전달 받은 subscription을 통해서 데이터 또는 시퀀스를 전달해달라고 요청한다.
  • onNext(): 데이터 전달 (정의는 subscriber, 호출은 publisher에서)
  • onComplete(): 데이터 전달 완료 시 호출
  • onError(): 데이터 전달 실패 시 호출

4) Subscription

  • request
  • cancel

콜드 시퀀스와 핫 시퀀스

  • 콜드 시퀀스
    -구독 시점부터 데이터를 새로 생성한다. 구독을 하지 않으면 데이터를 생성하지 않는다.
    -API 호출이 콜드 시퀀스의 예이다. 구독을 할 때마다 매번 새로운 요청을 서버에 전송하고 결과를 받는다.
  • 핫 시퀀스
    -구독 여부에 상관없이 데이터가 생성된다. 구독을 하면 구독한 시점 이후에 발생하는 데이터부터 신호를 받는다

*참고 자료
모던 자바 인 액션
우아한 형제들 기술블로그
https://juneyr.dev/reactive-programming
https://brunch.co.kr/@springboot/153
https://javacan.tistory.com/entry/Reactor-Start-1-RS-Flux-Mono-Subscriber

profile
자기 개발, 학습 정리를 위한 블로그

0개의 댓글

관련 채용 정보