동시성 모델
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개의 워커 스레드)가 필요한다.
'Reactive Programming' 카테고리의 다른 글
240815 Reactive Streaming 데이터 처리 (0) | 2024.08.15 |
---|---|
240809금 Spring Data R2DBC (0) | 2024.08.09 |
240804 Operators :: Sequence 내부 동작 확인 (0) | 2024.08.04 |
240804 Operators :: Sequence 변환 (0) | 2024.08.04 |
240720 Testing :: StepVerifier, TestPublisher PublisherProbe (0) | 2024.07.20 |