Spring WebFlux는 Spring 5에서 새롭게 추가된 모듈
WebFlux는 클라이언트, 서버에서 reactive 스타일의 어플리케이션 개발을 도와주는 모듈
reactive-stack web framework이며 non-blocking에 reactive stream을 지원
non-blocking :
- 요청한 작업을 즉시 마칠 수 없다면 즉시 return 한다.
- 즉시 리턴하지 않는다.(일을 못하게 막는다)
- Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.
reactive stream:
- 잠재적으로 무한한 숫자의 데이터 처리
- 순서대로 처리
- 컴포넌트간에 데이터를 비동기적으로 전달
- backpressure를 이용한 데이터 흐름제어
만들어진 이유:
적은 수의 스레드로 동시성을 처리하고 더 적은 하드웨어 리소스로 확장하기 위해
우리는 Reactive Stack 를 사용할지, Servlet Stack 를 사용할지 선택이 필요합
Spring MVC와 WebFlux의 공통점은 @Controller, Reactive 클라이언트이다
둘 다 Tomcat, Jetty, Undertow와 같은 서버에서 실행할 수 있다
적은 수의 쓰레드로 여러 요청을 담당한다
sync blocking IO
Application 에서 I/O 요청을 한 후 완료되기 전까지는 Application이 Block이 되어 다른 작업을 수행할 수 없다. 이는 해당 자원이 효율적으로 사용되지 못하고 있음을 의미한다.
그러나 생각을 해보면 Application들은 Blocking 방식임에도 불구하고 마치 Block이 안된듯이 동작하는 것처럼 보인다, 이것은 우리가 Single Thread를 기반으로 하는 것이 아닌 Multi Thread를 기반으로 동작하기 때문이다. Block 되는 순간 다른 Thread가 동작함으로써 Block의 문제를 해소하였다 그러나 Thread 간의 전환(Context Switching)에 드는 비용이 존재하므로 여러 개의 I/O를 처리하기 위해 여러 개의 Thread를 사용하는 것은 비효율적으로 보인다.
async non-blocking IO
I/O 요청을 한 후 Non-Blocking I/O와 마찬가지고 즉시 리턴된다. 허나, 데이터 준비가 완료되면 이벤트가 발생하여 알려주거나, 미리 등록해놓은 callback을 통해서 이후 작업이 진행됨
Blocking이 없기 때문에 자원을 보다 더 효율적으로 사용할 수 있다.
결론:
장점 : 고성능, spring 과 완벽한 통합, netty 지원, 비동기 non-blocking 메세지 처리
단점 : 오류처리가 다소 복잡하다. Back Pressure 기능 없음
Spring Webflux에서 사용하는 reactive library가 Reactor이고 Reactor가 Reactive Streams의 구현체이다.
Flux와 Mono는 Reactor 객체이며, 차이점은 발행하는 데이터 갯수 입니다.
보통 여러 스트림을 하나의 결과로 모아줄 때 Mono를, 각각의 Mono를 합쳐서 하나의 여러 개의 값을 처리할 때 Flux를 사용
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html [spring.io]
https://devuna.tistory.com/108 [튜나 개발일기]
https://www.youtube.com/watch?v=4x1QRyMIjGU&t=792s [10분 테코톡 호돌의 Spring Webflux]