<aside>
목차
</aside>
<aside> 💬
Node.js와 Netty(Spring WebFlux)는 둘 다 이벤트 루프 기반이지만 스레드 수, 컨텍스트 스위칭 전략, 실행 모델에서 중요한 차이점이 있다.
</aside>
<aside> ✏️
둘 다 블로킹 I/O 문제 해결, 컨텍스트 스위칭 최소화, 리소스 효율성 극대화라는 동일한 목적을 가진다.
</aside>
| 항목 | Node.js |
Netty ( Spring WebFlux ) |
|---|---|---|
| 핵심 실행 모델 | 싱글 이벤트 루프 | |
| (단일 스레드) | 멀티 이벤트 루프 | |
| (멀티 스레드) | ||
| 동작 원리 | Non-blocking, | |
| event-driven | Non-blocking, reactive | |
| (Reactor 기반) | ||
| 목적 | I/O 처리 병목 해소 | 블로킹 자원을 줄이고 고성능 처리 |
| 기반 기술 | libuv | |
| (C 기반 이벤트 루프) | Netty | |
| (Java NIO 기반) |
Node.js
<aside> ✏️
Node.js 자체는 “CPU 코어 수만큼 스레드를 사용하지는 않는다
하지만, 멀티 프로세스나 cluster 모드로 확장 가능하다.
단일 이벤트 루프 스레드 + 필요 시 libuv의 Worker Thread Pool 사용 </aside>
JavaScript 코드 자체는 1개의 스레드에서 실행됨
CPU 코어 수와 관계없이 Node.js는 기본적으로 하나의 이벤트 루프만 실행함
Worker Threads, child_process, clustrer, pm2 등을 통해 멀티 프로세싱 가능
libuv의 worker pool은 내부적으로 최대 4개까지 작업을 병렬 처리 가능 (디폴트 값)
process.env.UV_THREADPOOL_SIZE = 8; // 수동 설정 가능
Netty ( Spring WebFlux )
기본적으로 Netty는 CPU 코어 수만큼 이벤트 루프 스레드(NioEventLoopGrop)를 생성
new NioEventLoopGroup() // 디폴트: Runtime.getRuntime().availableProcessors()
요청-응답 자체는 Non-blocking이지만, CPU-bound 작업을 처리할 Scheduler/Worker 쓰레드는 별도로 동작함
Schedulers.boundedElastic() // 블로킹 연산 처리용 스레드 풀