본문 바로가기

Reactive Programming

240804 Spring MVC vs Spring WebFlux

동시성 모델

Spring MVC

동기적 요청 처리

- 서블릿 기반의 동기적 요청-응답 모델을 따른다.

- 클라이언트의 요청을 처리할 때, 서블릿 컨테이너는 요청을 스레드 풀에서 하나의 스레드로 할당한다.

 

블로킹 I/O

- 모든 요청은 블로킹 방식으로 처리된다.

- 요청을 처리하는 동안 해당 스레드는 응답이 완료될 때까지 차단된다.

Spring WebFlux

비동기적 요청 처리

- 비동기, 논블로킹 요청-응답 모델을 따른다.

- Netty, Undertow와 같은 논블로킹 I/O 런타임 위에서 동작할 수 있다.

 

논블로킹 I/O

- I/O 작업이 완료되기를 기다리지 않고 바로 다음 작업을 수행한다.

- 높은 동시성을 처리할 수 있다.

 

스레드 모델

Spring MVC

스레드 당 요청

- 각 클라이언트 요청은 서블린 컨테이너에서 스레드 풀에서 하나의 스레드를 할당받아 처리된다.

- 요청이 완료될 때까지 해당 스레드는 블로킹된다.

 

스케일링

- 높은 동시성 처리를 위해 많은 수의 스레드가 필요하다.

- 스레드 컨텍스트 전환 비용 및 메모리 사용량 증가를 초래할 수 있다.

Spring WebFlux

이벤트 루프 기반

- 기본적으로 이벤트 루프와 소수의 워크 스레드를 사용하여 요청을 처리한다.

- 요청 처리 중 I/O 작업이 필요할 때, 해당 작업이 비동기적으로 완료될 떄까지 스레드는 다른 작업을 처리할 수 있다.

 

적은 수의 스레드

- 일반적으로 CPU 코어 수 만큼의 스레드를 사용한다.

- 스레드 컨텍슽트 전환 비용을 줄이고 메모리 사용량을 최적화한다.

 

Spring WebFlux의 이벤트 루프 스레드 모델

요청 스레드, 워커 스레드

- 요청 스레드

   - 요청을 처리하고 비동기 작업을 관리하는 데 사용된다.

   - 보통 Netty 기반의 이벤트 루프 모델을 사용한다. :: 이벤트 루프 스레드

   - 단일 스레드로 운영된다.

- 워커 스레드

   - CPU 집약적인 작업이나 블로킹 작업을 처리하는 데 사용된다.

   - 일반적으로 스레드 풀에서 관리되며, 필요에 따라 여러 개의 스레드가 생성되고 사용된다.

- Spring WebFlux 애플리케이션은 최소 2개의 스레드(1개의 이벤트 루프 스레드, 1개의 워커 스레드)가 필요한다.