Untitled

Reactive Stack

Servlet Stack

1. Spring MVC

Untitled

클라이언트의 요청에 대해 큐에 먼저 넣고, 요청은 스레드 풀에서 처리되는 흐름을 갖는다.

매번 새로운 스레드를 만드는 것은 성능적으로 낭비이기 때문에 스레드 개수를 미리 만들어 놓고 사용하는 스레드 풀 전략을 사용하게 되는 것이다.

만약 너무 많은 요청이 들어오게 되면 스레드가 모두 사용될 수 있고 요청 대기열 마저 모두 차게되면 더 이상은 처리할 수 없게 되며 그 다음 요청들은 실패 처리가 된다.

Untitled

클라이언트가 요청을 하게 되면 서블릿 컨테이너로부터 비즈니스 로직 처리를 진행하게 된다. 이후 동기적으로 DB에 데이터 요청을 하나의 스레드로 진행하게 되는데, 하나의 스레드에서 순서대로 일련의 절차들이 동작하는 것은 문제 파악이나 흐름을 이해하는데 직관적이라고 할 수 있다.(장점)

Blocking I/O로 동작하기 때문에 DB에 요청한 쿼리 응답이 늦어지면 응답이 올 때까지 기다려야 하기 때문에 Client에게 응답하는 시간도 느려진다. 이렇게 지연되는 상황이 발생하게 되면 가용할 수 있는 스레드를 모두 소진하게 되고, 대기열(큐) 또한 가득차게 되면 그 다음 요청들은 모두 실패로 처리 된다.

대량의 I/O 요청이 있을 경우 그에 맞는 스레드 개수를 운용이 필요하므로 서버 리소스 관점에서 유용하다고 볼 수 없다.

2. Webflux

Non-Blocking 웹 프레임워크로 동작하게 되는데, 대량의 접속에 대해 동시 처리 하는데 유용한 구조를 갖고 있다.

Spring Webflux는 기본적으로 Netty를 활용하게 되는데, Netty는 Non-Blocking 이벤트 기반 네트워크 프레임워크다. Netty는 TCP와 UDP 프로토콜을 비롯한 다양한 프로토콜을 지원하며, 서버와 클라이언트 모두를 위한 API를 제공한다.

Netty의 주요 특징 중 하나는 높은 성능과 확장성을 제공한다는 것이다. Netty가 비동기 이벤트 드리븐 아키텍처를 사용하기 때문인데, 각 연결은 별도의 스레드가 아닌 이벤트 루프에서 처리되므로, 대량의 동시 연결을 효율적으로 처리할 수 있게 된다.

Netty가 웹 요청을 받는 첫 번째 컴포넌트다.

Untitled

Netty는 이벤트 루프를 사용한다고 말했는데, 이벤트 루프란 동시성 요청을 처리하기 위한 싱글 스레드 기반 스케줄러다. 다수의 이벤트 루프 기반으로 웹 요청과 응답을 비동기적으로 처리하게 된다.

  1. 동시적인 요청에 대해 단일 큐에 적재