SpringMVC vs WebFlux

오민석·2021년 7월 22일
0

Mono, Flux

Thread pool vs Event driven

Thread pool: Request들어오면 새로운 thread생성 되고 모든 처리가 해당 thread에서 처리

Event driven: 이벤트 루프가 이벤트를 호출하면 핸들러가 이벤트를 처리합니다. 여기서 중요한 것은 모든 핸들러가 동일한 스레드에서 호출된다는 것입니다.

https://sjh836.tistory.com/149

SpringMVC

멀티 스레드 & 동기방식 단점

위 그림처럼 유저들로부터 HTTP 요청이 들어올 때 요청들은 Queue를 통하게 된다. Thread pool이 수용할 수 있는 수(thread pool size)의 요청까지만 동시적으로 작업이 처리되고 만약 넘게 된다면 큐에서 대기하게 된다. 즉 하나의 요청은 하나의 Thread를 요구한다. (one request per thread model)
설정해놓은 thread pool size를 넘게 되면 위 그림처럼 작업이 처리될 때까지 Queue에서 계속해서 기다려야 한다. 그래서 전체의 대기시간이 늘어난다. 이런 현상을 Thread pool hell이라고 한다.
Thread pool이 감당할 수 있을 때까진 빠른 처리속도를 보이지만, 넘는 순간부터는 지연시간이 급격하게 늘어난다.

Thread pool은 다음과 같다. Thread를 생성하는 비용이 크기 때문에 미리 생성하여 재사용함으로써 효율적으로 사용한다. 그렇다고 과도하게 많은 Thread를 생성하는 것이 아니라 서버 성능에 맞게 Thread의 최대 수치를 제한시킨다. 참고로 tomcat default thread size는 200이다.

비동기 방식 필요성

기존의 모놀로식 아키텍쳐 환경에서는 스레드 풀을 이용해 동기식 프로그래밍의 blocking을 감당할 수 있었고, 단일 애플리케이션 내부에서 정보 교환이 일어나기 때문에 blocking되는 시간이 그리 길지 않았었다.
하지만 MSA에서는 blocking 시간이 길어지면 응답을 기다리는데 스레드를 모두 소진하여 추가 요청을 처리 할 수 없다. 이는 지연이 발생하면 다른 모듈에도 영향을 주어 전체 시스템 마비 등 영향을 끼친다.

WebFlux

Non Blocking 방식 통해 MSA에서는 수많은 Microservice가 거미줄처럼 서로를 네트워크를 통해서 호출하고 있다. 즉 많은 수의 Network I/O가 발생할 텐데 이를 Non Blocking I/O를 통해 좀 더 성능을 끌어올릴 수 있다

싱글스레드(=event loop) 단점

하나의 작업이 CPU를 많이 차지하면 blocking이 나니까 서비스의 형태마다 싱글/멀티스레드 활
용이 다르다.

Node.js 동작 원리

  1. Event Loop가 모든 콜백 실행
  2. Request들이 stack에 쌓임
  3. 오래 걸리는 작업들은 blocking 되서 Event Loop가 워커에 할당. 스택에서 내림
  4. Event Loop는 RR 방식으로 각 queue를 돌면서 결과 끝난 event queue의 작업들을 stack에 올린다.

Event Loop가 싱글 스레드지만 내부적으로 스레드풀을 두어 블로킹되는 I/O 작업들을 처리할 수 있다

이벤트루프는 몇 개의 phase 들로 구성되어 있다. 각 phase 들은 FIFO 큐를 가지고 있으며, 이 큐에는 특정 이벤트의 콜백들을 넣고, CPU가 할당(=이벤트루프가 해당 phase를 호출할때)될 때 실행한다.

성능 향상: 멀티코어, Cluster Module 통해 멀티 프로세스 가능

https://sjh836.tistory.com/149

멀티스레드 vs 싱글스레드

멀티스레드 장점:
- 프로세스 자원과 상태 공유하여 효율적으로 운영
- 멀티프로세스보다 context switch가 빠르다

멀티스레드 단점:
-동시 request가 많은 경우 많은 쓰레드가 필요하게 되어 서버 과부하
- 스레드가 data, heap공유하기에 동기화 작업 필요

싱글스레드 장점:
- 동시 request가 오더라도 처리가 완료될때까지 기다리지 않아도 되기 때문에 서버 부하가 적다.
- I/O 작업 많은 거에 유리 ex. 채팅, 스트리밍

싱글스레드 단점:

- cpu 활용율 낮다
- CPU 점유율 높으면 좋지 않다

Reference
https://velog.io/@dyllis/Spring-MVC-vs-WebFlux
https://alwayspr.tistory.com/44
https://pangtrue.tistory.com/191

0개의 댓글