Programming/잡다한것

Spring MVC와 Spring Webflux의 비교

junojuno 2023. 2. 26. 22:24

1. Spring MVC

Spring MVC

- Thread per request model로 구현되어 있다.

- 보통 tomcat 서버는 디폴트로 200개의 thread를 가진 thread pool을 지원한다.

 

분산시스템에서 API 서버가 아닌, 다른 API 서버의 REST API를 호출해 데이터를 통합하는 경우가 매우 흔한데, Blocking I/O 방식으로 동작하기 때문에 시스템 부하가 높다면 context switching과 thread data loading으로 인해 overhead가 발생한다.

얼마 안되는 코어(많아봤자 8코어)에 200개의 thread가 존재하기 때문에 thread끼리의 경합이 일어나 큰 부하로 이어진다.

- 리소스가 부족한 서버에서 처리할 수 있는 동시 처리량은 매우 제한적이다 (thread 생성 개수가 제한적이면)

 

[경합이란]  

*경합이란 어떤 스레드가 다른 스레드가 획득하고 있는 락(lock)이 해제되기를 기다리는 상태를 말한다. 웹 애플리케이션에서 여러 스레드가 공유 자원에 접근하는 일은 매우 빈번하다. 대표적으로 로그를 기록하는 것도 로그를 기록하려는 스레드가 락을 획득하고 공유 자원에 접근하는 것이다.

- 아래 출처 참고

 

2. Spring Webflux

Spring Webflux

- Event Loop Model로 동작한다

- 사용자 요청 및 application 내부에서 처리해야 하는 작업들은 모두 event라는 함수로 관리되고, event queue에 적재되어 순서대로 처리되는 구조이다.

- 그리고 event를 처리하는 thread pool이 존재한다. 따라서 순차적으로 event 처리해서  event loop이라 부르기도 한다.

- event loop은 event queue에서 event를 뽑아 하나씩 처리한다.

- Spring Webflux는 react library와 netty를 기반으로 동작한다. (netty의 경우, tomcat과 달리 thread 개수를 core *2로 관리한다)

- Non-Blocking I/O 방식으로 I/O 작업 처리를 하기에 thread block 되지 않는다.

 따라서 thread per request 모델 보다 context switching의 overhead가 줄어들고 thread수가 작아 core를 차지하기 위한 경합또한 줄어든다.

- Spring Webflux를 통해 높은 처리량이 나오는 이유는 Event Loop + Non-Blocking I/O 때문이다. (Thread 성능을 쥐어 짜기에)

- 상대적으로 적은 thread pool을 유지하기 때문에 CPU 사용량이 높은 작업이 많거나 Blocking I/O 사용시 event loop가 빨리 event queue의 event를 처리하지 못해서 성능하락으로 이어진다. (Cpu Bound 프로세스 경우 Webflux 적합하지 못함)

 

- EventLoopGroup은 하나 이상의 지속적으로 동작하는 Event Loop을 관리한다. context switching 을 최소한으로 하기 위해 이용가능한 core수 보다 더 많은 Event Loop 를 만드는 것은 추천되지 않는다.

 

내 정리)모든 요청 마다 thread를 생성하는 spring MVC의 thread per request model의 문제점을 극복하고자, non-blocking I/O를 사용하여 모든 요청을 event queue에 쌓아두고, event loop가 thread pool에 있는 thread에 event들을 지속적으로 할당하면서 callback 형식으로 thread에 push하고 작업이 끝나면 응답을 받는 형식으로 thread를 최대한 쥐어짬으로서 적은 thread로 성능을 높히는 방법이 webflux의 방법이다.. 

출처 ) 

[Thread per request vs Event loop]

https://velog.io/@jihoson94/EventLoopModelInSpring

[NHN Forwad]

https://www.youtube.com/watch?v=I0zMm6wIbRI 

[Netty]

https://velog.io/@monami/Netty

[경합]

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