
Java Spring MVC 환경에서 우리는 ThreadLocal을 사용하고, 스레드 안전성(Thread-safety)을 위해 ConcurrentHashMap을 고민한다. 하지만 Node.js는 "메인 스레드는 하나뿐"이라는 파격적인 설계를 택했다. 왜 그랬을까?
synchronized) 문제에서 자유롭다.엄밀히 말하면 "우리가 작성한 자바스크립트 코드가 실행되는 스레드"가 하나인 것이다. Node.js 내부(C++로 작성된 Libuv)에는 여전히 Thread Pool이 존재한다.
즉, Node.js는 "주문받는 점원(메인 스레드)은 한 명이지만, 주방 안에서 실제 요리를 하는 요리사(내부 스레드)는 여러 명"인 구조다.
싱글 스레드 모델에서 가장 피해야 할 것은 'CPU Intensive' 작업이다.
그렇다면 점원 여러 명(멀티 스레드)이 모두 논블로킹 방식으로 주문을 받으면 좋지 않을까? 실제로 그렇다. 다만, 멀티 스레드 방식으로 프로그래밍을 하는 것은 상당히 어렵기 때문에, 멀티 프로세싱 방식을 대신 사용한다.
I/O 요청엔는 멀티 프로세싱이 더 효율적이기도 하다.
| 멀티 스레딩 | 멀티 프로세싱 |
|---|---|
| 하나의 프로세스 안에서 여러 개의 스레드 사용 | 여러 개의 프로세스 사용 |
| CPU 작업이 많이 사용될 때 사용 | I/O 요청이 많을 때 사용 |
| 프로그래밍이 어려움 | 비교적 쉬움 |
I/O 작업을 처리할 때는 멀티 스레딩보다 멀티 프로세싱이 효율적이므로 노드는 멀티 프로세싱을 많이 한다.