Java New Input/Output의 약자로 기존 자바의 IO 방식보다 효율적이고 스케일 가능한 IO 작업 처리 위한 API.
비동기 버퍼 기반 데이터 전송 방식으로 IO 성능 크게 향상.
기존 IO 보다 나은 멀티스레딩 기능 제공. (논블로킹)
Tomcat은 NIO 커넷터 통해 사용자의 요청 받음.
하지만 Spring webflux는 Tomcat이 아닌 Netty 사용함. 왜 Tomcat 쓰지 않는걸까?
Tomcat 스레드 풀에서 가능한 요청 처리 스레드가 모두 작업중일 때, 그 이후 요청은 대기 큐로 이동.
Thread Pool Design 패턴 : 이처럼 고정된 스레드 풀 통해 여러 작업 실행하는 패턴.
작업 -> 스레드 풀 실행자 -> 지정된 스레드 or 대기 / 종료.
Tomcat은 요청에 대한 스레드 모델인 Thread Per Request 모델로 동작 -> 들어오는 각 요청에 스레드를 할당하는 것.
즉 스레드 풀 꽉차면 요청은 대기 큐로!
사용자기 대기해야 함.
NIO 커넥터로 사용자 요청 pollerEvent에 추가하고, poller가 채널 획득 -> 프로세싱 진행한다고 해도
모든 스레드 사용중이라면 사용자도 대기 해야 함 or 연결 불가.
Tomcat 방식을 벽에 공 던지기 하는 모습과 비슷.
공 돌아올때 까지 던질 공들은 대기하고 있어야 함.
하지만 Netty는?
Netty는 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크.
비동기 논블로킹 방식.
적은 스레드로 많은 연결 모니터링 가능, 사용자가 응답 안기다려도 됨.
Netty도 Tomcat의 thread pooling pattern과 같은 방식 사용하고, 이는 컨텍스트 전환 비용 없애지 못하고 프로젝트 수명 기간 동안 다른 스레드 관련 문제 발생 가능.
But, Netty는 EventLoop은 이용해 단순화.
Tomcat과 달리 레일 위에 공 놓는것과 같은 방식.
Tomcat은 요청 당 하나의 스레드가 동작하는 반면, Netty는 1개의 이벤트를 받는 스레드와 다수의 worker 스레드로 동작.
<참고>
https://velog.io/@akfls221/Netty
https://ooeunz.tistory.com/109