Spring WebFlux

fireFox·2022년 5월 2일
0

개요

Reactive 스타일 어플리케이션 개발을 위한 모듈

Spring WebFlux는 Reactive 스타일 어플리케이션 개발을 위해 Spring 5에서 새롭게 추가된 모듈이다.

비동기&Non-blocking을 지원하는 웹 스텍의 필요성 때문에 개발되었다. Spring MVC도 3.1부터 비동기방식을 지원하는 기능이 추가되었지만 Blocking 방식의 API들이 있었고 또한 Backpresure를 지원하지 않기때문에 완전한 Reactive 프로그래밍 방식이라고 보기 힘들었다.

Spring WebFlux는 Spring MVC의 문제점을 보완하고 더 완벽한 Reactive 프로그래밍을 하기 위해서 개발되었다.

하지만 Spring WebFlux가 기존의 Spring MVC을 대체하는 개념은 아니며, 장단점이 있으므로 웹의 용도에 맞게 사용하면 된다. 아래에서 WebFlux를 사용하면 좋은 상황과 이유 특징들을 살펴보자.

사용하는 이유

1) Spring MVC의 스레드 문제 해결 :

  • Spring MVC는 하나의 요청에 하나의 스레드가 생성된다. 하지만 스레드는 생성될때 사용되는 메모리량이 많고 스레드가 많이 생성될수록 컨텍스트 스위칭이 빈번하게 발생하여 비용이 커지기 때문에 보통 스레드풀을 만들어 재사용하는 방식을 사용한다.
  • 이런 방식에서 특정 IO 응답이 느려진다면 해당 스레드는 거기서 응답이 올 때까지 대기 하게 된다. 이 상황이 지속되면 스레드 풀에 있는 모든 스레드들이 대부분 그 위치에 오랜 시간 대기하게 되고 결국 모두 소진되어 이후 발생하는 요청이 더이상 스레드를 확보할 수 없어 실패하게 된다. 단 한 군데의 IO 지연이 발생했지만 결국 전체 시스템을 사용할 수 없는 경우가 되는 것이다.
  • 이런 문제점을 해결하기 위해 Spring WebFlux에서는 비동기&Non-blocking과 고정된 스레드 수 만으로 모든 요청을 처리함으로 위의 문제들을 해결한다.

2) 적은 양의 스레드로 동시성 처리가능
3) 비동기&Non-blocking 방식으로 한정된 자원을 효율적으로 사용 가능.

특징

1) Non-Blocking IO : WebFlux는 Non-Blocking을 사용하여 최소한의 스레드로 효율적인 운영을 할수가 있다. (Non-Blocking하게 동작하기 때문에 다른 함수를 호출해놓고 내 작업을 진행하는것이 가능.)
2) Funtional Endpoint : 람다 기반의 새로운 Controller의 구현 방법인 Funtional Endpoint를 사용가능하다. request/response를 APP에서 전부 제어 가능.
3) Netty 같은 비동기&Non-blocking, 이벤트기반 서버 사용가능.

Spring WebFlux를 사용하면 좋은 상황

  • 비동기, Non-blocking reactive 개발을 해야할 상황
  • 효율적으로 동작하는 고성능 웹어플리케이션 개발이 필요할 때
  • 서비스간 호출이 많은 마이크로서비스 아키텍처를 사용해야 할 때

Spring MVC 패턴과의 성능 비교

초록색 : WebFlux
빨간색 : MVC

  • 그래프를보면 응답속도가 일정한 WebFlux에 비해 MVC는 유저가 늘어날수록 성능이 차이가 커지는걸 확인할 수 있다.
  • MVC 방식은 서버의 하드웨어 성능으로 커버가 가능한 구간을 지나면 스레드 풀이 점점 많아져, Queue에 쌓이면서 느려지게 된다.
  • WebFlux 방식은 non-blocking을 통해 I/O를 잘 이용하여 효율적으로 처리하기 때문.

참고자료

https://ckddn9496.tistory.com/158
https://heeyeah.github.io/spring/2020-02-29-web-flux/
http://gunsdevlog.blogspot.com/2020/09/reactive-streams-reactor-webflux.html

profile
기억날때 기록하자

0개의 댓글