WebFlux 이해하기

h블로그·2022년 4월 14일
0

'webflux를 사용한다.' 는 문구를 이해하기 위해서 webflux를 검색했다. 함께 나오는 다양한 용어들과 상황을 이해하기 위해서 정리해보았다.

Spring MVC vs Spring Webflux

Spring MVC는 servlet 기반으로 blocking 방식이다.
Spring Webflux는 Spring5에서 도입된 non-blocking 방식이다. Reactive Streams 의 구현체인 Reactor 를 가지고 있다.

blocking vs non-blocking

blocking은 요청이 들어오면 그 요청을 마칠때까지 스레드가 기다린다. 구현이 쉽지만 요청이 많은경우 스레드풀이 날수 있다.
non-blocking은 스레드가 답이 오기 전에 다른일을 하다가 답이 오면 그때 다시 일을 수행한다.
즉, 한 스레드가 다양한 일을 동시에 수행함으로 적은 리소스로 빠르게 많은일을 처리할 수 있다.

back pressure

컴포넌트는 상류 컴포넌트들에게 자신이 과부하 상태라는 것을 알려 부하를 줄이도록 한다

publisher에서 발행하고 subscriber에서 구독할 때 , pull 방식으로 subscriber가 publisher로 처리할 수 있는 양의 크기만큼 데이터를 요청해서 subscriber의 장애를 방지한다.

MSA 아키텍처에서 blocking 방식의 문제점

Monolithic 아키텍처에서 msa 아키텍처로 가면서 작고 많은 모듈로 쪼개지게 되었고, 서로 통신하는 양이 훨씬 많아져 blocking 방식에서는 스레드풀이 발생할 확률이 높아졌다.
스레드풀이 발생하면 어플리케이션 전체적으로 악영향을 끼칠수 있다.

Reactive Streams

non-blocking과 back pressure 를 이용한 비동기 처리 표준이다.

Reactor의 Mono와 Flux

  • Mono : 0~1개 데이터 전달

  • Flux : 0~n 개 데이터 전달

  • 리턴타입에 MonoFlux를 정의하여 이 메소드는 비동기 형식을 사용한다.

    • Mono나 Flux 에 담긴건 subscribe{ } 연산자를 사용하지 않으면 데이터를 사용하지 않는다.

subscribe 연산자

구독한다의 개념으로 이해할수 있으며, 연산자를 사용하여 구현하면 콜백함수를 등록하게 된다.
그래서 비동기 데이터가 왔을때 등록된 콜백함수가 구현되어 비동기 형식의 데이터를 사용하게 된다.

map 연산자

Mono와 Flux를 사용한 비동기 프로그래밍한 예제들을 보면 map 연산자도 많이 사용한다.
그래서 map 도 subscribe 연산자처럼 콜백함수를 등록하는 것으로 헷갈렸었다. 그러나 명확히 map은 데이터 변환을 위해서 주로 쓰이는 것이며 subscribe처럼 콜백함수를 동록하지 않기 때문에 비동기 데이터를 사용하지 않게 될수 있다.

주의

Webflux에서도 db가 동기식이거나 구현을 비동기 프로그래밍을하지 않는다면 동기식으로 동작하게 된다.
Webflux의 장점은 적은 스레드로 많은 작업을 수행하여 성능을 높이는게 컨셉이므로, 동기식으로 구현한다면 Webflux의 장점을 얻기가 어렵다.

참고

https://d2.naver.com/helloworld/6080222

profile
😎🙈🙈🙈🤓

0개의 댓글