2024.05.21 - [Spring/대용량 트래픽] - sync/async 와 block/non-block
Spring MVC와 Webflux는 뭐가 다를까??
우선 Spring Webflux는 SpringBoot 2부터 지원한다.
Reactive Stack은 프로젝트 Reactor를 필수로 사용한다.
- Reactor : Reactive Stream의 구현체, 비동기(ASync)처리에 기반
Reactive Stack | Servlet Stack |
ASync | Sync |
non-blocking | blocking |
Spring Cloud | 대표적인 Servlet Container 오픈소스 : 톰캣(tomcat) |
Spring MVC
HTTP요청을 큐에 먼저 넣고, 스레드 풀에서 처리를 하게되는 흐름을 가진다.
위 그림은 Spring MVC의 동작과정을 좀 더 상세하게 보여준다.
Servlet에서 요청을 받고, Spring Container(Tomcat)에서 비즈니스로직을 처리한다.
여기서 DB와 Server와의 데이터 전달은 하나의 스레드에서 순차적으로 이루어지는 blocking, Sync I/O 방식으로 진행된다. 직관적이고 이해하기 쉬운 장점이 있지만, 하지만 항상 응답을 대기해야하므로 응답시간이 길어진다.
만약 트래픽 과부하가 걸린상황이면 I/O요청을 기다리면서 처리해야하는 요청들을 수행하는 스레드 풀도 포화상태, 더 나아가 요청들이 담기는 queue또한 포화상태가 되어, 다른 요청들은 전부 실패처리가 되고 결국에는 서비스 마비가 될것이다.
Reactive Stack
처음에 설명한 스프링 공식문서에서 봤듯이 Reacitve Stack의 설명을 보면 Netty라는 것이 등장한다. 뭘까?
Netty : Non-blocking event 기반 프레임워크이다. 더불어 내부적으로 I/O Multiplexing 기반 event loop를 사용해서 높은 성능을 보장한다. Netty 자체에서 TCP/UDP, HTTP웹소캣등 다양한 프로토콜도 지원한다.
우선 Netty가 웹 요청을 첫번째로 받는 컴포넌트이다.
여기서 event loop는 동시성 요청 처리를 위한 single thread기반 스케쥴러이다.
동시적인 요청들에 대해 단일 큐에 적재를 하고, event loop는 반복해서 해당 큐에있는 내용을 꺼내고 핸들러를 실행한다.
대표적으로 JavaScript의 Node.js가 이런 구조를 사용한다.
Netty에서는 다수의 event loop를 활용한다.
Netty는 내부적으로 두개의 큰 Event loop그룹을 활용하고 있다.
각 Event loop 그룹은 개념적으로 그룹화 한것이다. single thread 기반 event loop를 여러개 운영이 가능하다는 의미이다.
- Boss Event Loop Group : 클라이언트 연결 요청에 대한 Acceptor 역할을한다. 하나의 event loop로 운영한다.
- Worker Event Loop Group : 데이터 송수신에 대해 패킹 데이터를 처리한다. 여러개의 event loop로 운영한다.
Event Loop과 연결된 Channel은 클라이언트와의 연결을 의미한다.
하나의 event loop는 다수의 채널을 다룰수 있는 I/O multiplexing을 지원한다. + non-block I/O도 함께사용.
각 채널에는 채널 핸들러라는것을 pipeline방식으로 추가할수있고, 이 구조를 통해 다양한 이벤트(ex. HTTP 프로토콜)를 단계적으로 처리할 수있다.
- Reactive Streams Adapters : Reactive Stream의 다양한 구현체를 수용할수있는 어댑터이다. Spring Webflux는 어댑터와 통합되어 운영된다.
- Spring Security Reacitve : Spring Security의 반응형 버전으로, 보안과 관련된 기능을 제공한다.
- Spring WebFlux : Spring MVC에 대응된다.
- Spring Data Reactive Repositories : Spring Data의 반응형 인터페이스 기능을 제공하는 부분이다.
RDB의 경우 JPA, ORM을 제공하지 않기 때문에 R2DBC(Reactive Relational DataBase Connectivity)를 활용해야한다.
위의 설명한 것들은 전부 Non-blocking, ASync로 처리될수 있다.
우선 Netty가 웹 요청을 첫번째로 받는 컴포넌트이다.
Netty이후로, Reactor로 데이터를 전달하는 흐름을 가지게 된다.
DB나 외부 API들에 대한 Server 요청은 Reactor를 통해 비동기처리를 하게 된다.
이제 전반적으로 Netty에 대해서는 어떻게 동작하는지 알아보았고, Reactor가 어떻게 동작하는지 알아봐야한다.
2024.05.22 - [Spring/대용량 트래픽] - Spring Webflux Reactor와 다양한 연산자
'Spring > 대용량 트래픽' 카테고리의 다른 글
Spring Webflux 사용해보기 (0) | 2024.05.29 |
---|---|
Spring Webflux Reactor와 다양한 연산자 (0) | 2024.05.22 |
sync/async 와 block/non-block (0) | 2024.05.21 |
CPU Bound vs I/O Bound (1) | 2024.05.21 |
Spring Webflux란? (0) | 2024.05.21 |