빅데이터, 다양한 애플리케이션 환경, 빠른 응답 시간을 요구하는 사용자들에 대한 사용 패턴이라는 변화되는 환경 속에서 다양한 소스에서 들어오는 데이터 흐름(스트림)을 비동기적으로 합쳐서 문제를 해결해 나가는 프로그래밍 방식을 의미한다.
우아한 형제들 기술블로그에서는 여러 API를 취합해서 전달해야 하는 시스템에서는 각 API 경과시간의 sum 만큼의 시간이 필요하지만, 리액티브 시스템을 이용하면 요청을 비동기로 동시에 보내기 때문에 각 API 경과시간 중 가장 긴 요청 시간만큼만 걸린다고 했다.
리액티브 프로그래밍을 위해 Spring WebFlux에서는 Reactor 라이브러리를 제공했다.
Spring Reactor, RxJava는 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의 부하를 유지할 수 없을 경우를 대비해 큐에 임시 저장하여 버퍼링을 할 수도 있다.
1) Processor
2) Publisher
3) Subscriber
4) Subscription
*참고 자료
모던 자바 인 액션
우아한 형제들 기술블로그
https://juneyr.dev/reactive-programming
https://brunch.co.kr/@springboot/153
https://javacan.tistory.com/entry/Reactor-Start-1-RS-Flux-Mono-Subscriber